每次尝试将对象保存为json到共享首选项时,我都会收到此IO异常。
W/SharedPreferencesImpl: writeToFile: Got exception:
java.io.IOException: java.nio.charset.CoderResult[Malformed-input error with erroneous input length 1]
at com.android.internal.util.FastXmlSerializer.flush(FastXmlSerializer.java:245)
at com.android.internal.util.FastXmlSerializer.endDocument(FastXmlSerializer.java:198)
at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:193)
at android.app.SharedPreferencesImpl.writeToFile(SharedPreferencesImpl.java:600)
at android.app.SharedPreferencesImpl.-wrap2(SharedPreferencesImpl.java)
at android.app.SharedPreferencesImpl$2.run(SharedPreferencesImpl.java:515)
at android.app.SharedPreferencesImpl.enqueueDiskWrite(SharedPreferencesImpl.java:536)
at android.app.SharedPreferencesImpl.-wrap0(SharedPreferencesImpl.java)
at android.app.SharedPreferencesImpl$EditorImpl.commit(SharedPreferencesImpl.java:458)
从日志中我发现了一些不好的字符串,但我不知道到底出了什么问题。
导致此问题的代码是:
Gson gson = new Gson();
String json = gson.toJson(value);
SharedPreferences prefs = getSharedPrefs(ctx);
prefs.edit().putString(key, json).commit();
有没有办法解决这个问题而不写一些疯狂的ObjectOutputStream
?
更新
当我将它打印到日志时,我想写的json看起来像这样:
{"coordinates":{"latitude":54.55445,"longitude":25.54581,"mVersionCode":1},"name":"CityName"}
更新2
PreferenceManager.getDefaultSharedPreferences(ctx);
这一行在我给定的代码中引起了这一行,这一行是getSharedPrefs(context);
方法。当我使用context.getSharedPreferences(set, Context.MODE_PRIVATE);
时,一切都运行正常。
我注意到无论我对共享首选项有什么价值,我都会收到此异常(来自默认共享首选项)。
在我写的测试应用程序中,即使我尝试将大json保存到1000个不同的首选项,也不会发生错误。
应用程序,Thorw异常更大并使用multidex。