android 屏幕关闭 eofexception,android EOFException异常解决办法 (SharedPreferences保存对象)...
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)));
總結
以上是生活随笔為你收集整理的android 屏幕关闭 eofexception,android EOFException异常解决办法 (SharedPreferences保存对象)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑绣花制版软件评比(上)
- 下一篇: LACP协议介绍