SharedPreferences 利用字节数组保存对象

转载自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;
}
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值