SharePreferences可以保存String 但是不能保存对象

这不符合面向对象。

为此可以通过序列化和反序列化将Serializable对象和字符串相互转化 


所以可以将Serizlizable对象转化为字符串保存到SharedPreferences中

SharedPreferences.Editor localEditor = settings.edit();localEditor.putString(key,SerialbleTools.writeObject(serializable)));


读取时将字符串转化为指定对象

String content=getInstance().share.get(cls.getName());return cls.cast(SerialbleTools.readObject(Base64.decode(content)));


这是  序列化 反序列化工具类

public class SerialbleTools {//序列化对象为String字符串,先对序列化后的结果进行BASE64编码,否则不能直接进行反序列化      public static String writeObject(Object o) throws Exception {      synchronized (SerialbleTools.class) {    ByteArrayOutputStream bos = new ByteArrayOutputStream();              ObjectOutputStream oos = new ObjectOutputStream(bos);              oos.writeObject(o);              oos.flush();              oos.close();              bos.close();               return new String(bos.toByteArray(), "ISO-8859-1");  }            }        //反序列化String字符串为对象            public static Object readObject(String object) throws Exception{          synchronized (SerialbleTools.class) {    //ByteArrayInputStream bis = new ByteArrayInputStream(new BASE64Decoder().decodeBuffer(object));              ByteArrayInputStream bis = new ByteArrayInputStream(object.getBytes("ISO-8859-1"));              ObjectInputStream ois = new ObjectInputStream(bis);              Object o = null;              try {    o = ois.readObject();    } catch (EOFException e) {    // TODO Auto-generated catch block    e.printStackTrace();    }            bis.close();              ois.close();                         return o;  }                 }  }


应用初始运行正常,但当应用退出或者重启以后(如系统重新开机 清理内存以后)

SharedPreferences 读取到字符串无法反序列化为一个对象 也就是在如下代码中报错 异常EOFException

 try {    o = ois.readObject();    } catch (EOFException e) {    // TODO Auto-generated catch block    e.printStackTrace();    }

该异常是文件流末报错。原因是由于java序列化以后有很多无法识别的字符串,当退出app的时候

特殊的字符串在保存时导致文件末尾损坏。


解决办法使用Base64 将字符串转化为 进行写入对象

share.put(serializable.getClass().getName(), Base64.encode(SerialbleTools.writeObject(serializable))

Base64解析对象
String content=getInstance().share.get(cls.getName());return cls.cast(SerialbleTools.readObject(Base64.decode(content)));


更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. 分支和循环(二)(零基础学习C语言)
  3. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  4. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  5. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  6. android中关于tools:context="activity name"解惑
  7. 在Android中使用MD5
  8. android sdk 超时 解决办法
  9. andriod 中下载图片到sdcard中例子

随机推荐

  1. android studio每次启动都要在fetching A
  2. Android——四大组件、六大布局、五大存
  3. 自定义ListView分割线
  4. Android事件分发机制完全解析(二)
  5. Android基础学习【历史流程重走】 ---- A
  6. achartengine(Google给android提供的绘图
  7. Android添加自定义系统服务
  8. Android开发Tips(3)
  9. android loginDemo +WebService用户登录
  10. android 实现指定wifi切换