我有一个小的Serializable对象,我需要在Activity的上下文之外的会话之间保持。我的第一个想法是将它写入SharedPreferences文件,但不幸的是,该类不支持读取或编写通用的Serializable。但它确实支持String。所以我的下一个想法是:Serializable只是一个字节数组,而String只是一个2字节字符数组...为什么不一次将我的数组切两个字节,将每对字节转换为char,并从这些字符中构建一个字符串(然后反过来将其读回)?我试过这个并且工作正常,大部分时间。但有一段时间,该对象无法序列化。在查看了一段时间后,我意识到在读取失败之前的写入期间发生了一些可疑的事情。具体来说,logcat显示在写入期间在框架代码中抛出(和捕获)以下异常:
java.io.IOException: java.nio.charset.CoderResult[Malformed-input error with erroneous input length 1]
at com.android.internal.util.FastXmlSerializer.flush(FastXmlSerializer.java:225)
at com.android.internal.util.FastXmlSerializer.endDocument(FastXmlSerializer.java:183)
at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:186)
at android.app.SharedPreferencesImpl.writeToFile(SharedPreferencesImpl.java:596)
at android.app.SharedPreferencesImpl.access$800(SharedPreferencesImpl.java:52)
at android.app.SharedPreferencesImpl$2.run(SharedPreferencesImpl.java:511)
at android.app.SharedPreferencesImpl.enqueueDiskWrite(SharedPreferencesImpl.java:532)
at android.app.SharedPreferencesImpl.access$100(SharedPreferencesImpl.java:52)
at android.app.SharedPreferencesImpl$EditorImpl.commit(SharedPreferencesImpl.java:454)
这个例外永远不会传播到我的代码中;就目前所知,一切正常。
在阅读char文档here之后,我最好的猜测是,我有时巧合结束了一个char,其数值将其置于“高代理”范围内,该字符在“低代理“范围,因此我的String只是普通无效(或者至少能够混淆SharedPreferences / XML代码)。
当然,我可以并且可能会使用常规文件I / O或Base64编码,但我想了解可能出现的问题。