当前位置: 代码迷 >> Android >> Android SharedPreferences封存和读取对象
  详细解决方案

Android SharedPreferences封存和读取对象

热度:63   发布时间:2016-04-27 23:44:48.0
Android SharedPreferences保存和读取对象

SharedPreferences保存和读取对象

1.首先要序列化对象(下面是序列化实体类的例子,不方便贴出实体类所有的代码)

public class LoginResult extends BaseResult implements Serializable{	private static final long serialVersionUID = 1L;		private String mobiletoken;

2.保存和读取对象的封装

public class ObjectSaveUtil {		private final static String FILENAME = "login_data_save";		private final static String KEY = "loginResult";		  /**	   * desc:保存对象	 	   * @param context	   * @param key 	   * @param obj 要保存的对象,只能保存实现了serializable的对象	   * modified:		   */	  public static void saveObject(Context context,Object obj){	      try {	          // 保存对象	          SharedPreferences.Editor sharedata = context.getSharedPreferences(FILENAME, 0).edit();	          //先将序列化结果写到byte缓存中,其实就分配一个内存空间	          ByteArrayOutputStream bos=new ByteArrayOutputStream();	          ObjectOutputStream os=new ObjectOutputStream(bos);	          //将对象序列化写入byte缓存	          os.writeObject(obj);	          //将序列化的数据转为16进制保存	          String bytesToHexString = bytesToHexString(bos.toByteArray());	          //保存该16进制数组	          sharedata.putString(KEY, bytesToHexString);	          sharedata.commit();	      } catch (IOException e) {	          e.printStackTrace();	          Log.e("", "保存obj失败");	      }	  }	  /**	   * desc:将数组转为16进制	   * @param bArray	   * @return	   * modified:		   */	  public static String bytesToHexString(byte[] bArray) {	      if(bArray == null){	          return null;	      }	      if(bArray.length == 0){	          return "";	      }	      StringBuffer sb = new StringBuffer(bArray.length);	      String sTemp;	      for (int i = 0; i < bArray.length; i++) {	          sTemp = Integer.toHexString(0xFF & bArray[i]);	          if (sTemp.length() < 2)	              sb.append(0);	          sb.append(sTemp.toUpperCase());	      }	      return sb.toString();	  }	  /**	   * desc:获取保存的Object对象	   * @param context	   * @param key	   * @return	   * modified:		   */	  public static Object readObject(Context context){	      try {	          SharedPreferences sharedata = context.getSharedPreferences(FILENAME, 0);	          if (sharedata.contains(KEY)) {	               String string = sharedata.getString(KEY, "");	               if(TextUtils.isEmpty(string)){	                   return null;	               }else{	                   //将16进制的数据转为数组,准备反序列化	                   byte[] stringToBytes = StringToBytes(string);	                     ByteArrayInputStream bis=new ByteArrayInputStream(stringToBytes);	                     ObjectInputStream is=new ObjectInputStream(bis);	                     //返回反序列化得到的对象	                     Object readObject = is.readObject();	                     return readObject;	               }	          }	      } catch (StreamCorruptedException e) {	          // TODO Auto-generated catch block	          e.printStackTrace();	      } catch (IOException e) {	          // TODO Auto-generated catch block	          e.printStackTrace();	      } catch (ClassNotFoundException e) {	          // TODO Auto-generated catch block	          e.printStackTrace();	      }	      //所有异常返回null	      return null;	      	  }	  /**	   * desc:将16进制的数据转为数组	   * <p>创建人:聂旭阳 , 2014-5-25 上午11:08:33</p>	   * @param data	   * @return	   * modified:		   */	  public static byte[] StringToBytes(String data){	      String hexString=data.toUpperCase().trim();	      if (hexString.length()%2!=0) {	          return null;	      }	      byte[] retData=new byte[hexString.length()/2];	      for(int i=0;i<hexString.length();i++)	      {	          int int_ch;  // 两位16进制数转化后的10进制数	          char hex_char1 = hexString.charAt(i); ////两位16进制数中的第一位(高位*16)	          int int_ch3;	          if(hex_char1 >= '0' && hex_char1 <='9')	              int_ch3 = (hex_char1-48)*16;   //// 0 的Ascll - 48	          else if(hex_char1 >= 'A' && hex_char1 <='F')	              int_ch3 = (hex_char1-55)*16; //// A 的Ascll - 65	          else	              return null;	          i++;	          char hex_char2 = hexString.charAt(i); ///两位16进制数中的第二位(低位)	          int int_ch4;	          if(hex_char2 >= '0' && hex_char2 <='9')	              int_ch4 = (hex_char2-48); //// 0 的Ascll - 48	          else if(hex_char2 >= 'A' && hex_char2 <='F')	              int_ch4 = hex_char2-55; //// A 的Ascll - 65	          else	              return null;	          int_ch = int_ch3+int_ch4;	          retData[i/2]=(byte) int_ch;//将转化后的数放入Byte里	      }	      return retData;	}	}

挺好用的,欢迎大家复制使用


版权声明:本文为博主原创文章,未经博主允许不得转载。

  相关解决方案