网站运行模式,海口软件开发公司,做网站对服务器要求,百度关键词优化查询SharePreferences可以保存String 但是不能保存对象这不符合面向对象。为此可以通过序列化和反序列化将Serializable对象和字符串相互转化所以可以将Serizlizable对象转化为字符串保存到SharedPreferences中SharedPreferences.Editor localEditor settings.edit();localEditor.…SharePreferences可以保存String 但是不能保存对象这不符合面向对象。为此可以通过序列化和反序列化将Serializable对象和字符串相互转化所以可以将Serizlizable对象转化为字符串保存到SharedPreferences中SharedPreferences.Editor localEditor settings.edit();localEditor.putString(key,SerialbleTools.writeObject(serializable)));读取时将字符串转化为指定对象String contentgetInstance().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 blocke.printStackTrace();}bis.close();ois.close();return o;}}}应用初始运行正常但当应用退出或者重启以后(如系统重新开机 清理内存以后)SharedPreferences 读取到字符串无法反序列化为一个对象 也就是在如下代码中报错 异常EOFExceptiontry {o ois.readObject();} catch (EOFException e) {// TODO Auto-generated catch blocke.printStackTrace();}该异常是文件流末报错。原因是由于java序列化以后有很多无法识别的字符串当退出app的时候特殊的字符串在保存时导致文件末尾损坏。解决办法使用Base64 将字符串转化为 进行写入对象share.put(serializable.getClass().getName(), Base64.encode(SerialbleTools.writeObject(serializable))Base64解析对象String contentgetInstance().share.get(cls.getName());return cls.cast(SerialbleTools.readObject(Base64.decode(content)));