android EOFException異常解決辦法 (SharedPreferences儲存物件)
阿新 • • 發佈:2019-02-10
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)));