1

这是来自此处的后续问题:Save Bundle to SharedPreferences

我正在尝试使用上述线程中的 ComplexPreferences 类在我的 Android 应用程序中保存一个 Bundle 对象,但无济于事!这是我用来保存数据并将数据加载到 ComplexPreferences 的代码(与 ComplexPreferences 类的下载页面上的示例非常相似):

第一类:

save = ComplexPreferences.getComplexPreferences(this, SAVE, MODE_PRIVATE);
...
Bundle gameState = new Bundle();
saveGameData(gameState); // This puts the game data into the Bundle
save.putObject(SAVE, gameState);
save.commit();

类2:

save = ComplexPreferences.getComplexPreferences(this, Class1.SAVE, MODE_PRIVATE);
...
Bundle gameState = save.getObject(Class1.SAVE, Bundle.class);

问题似乎出在将对象保存到 ComplexPreferences 时。这是我在运行上述代码时得到的堆栈跟踪:

致命异常:主要java.lang.RuntimeException:无法暂停活动{djb.ampersands/djb.ampersands.Ampersands}:java.lang.IllegalStateException:循环引用错误违规字段:游戏违规对象:preserveType:false,类型:djb类.ampersands.Ampersands, obj: djb.ampersands.Ampersands@41272778 at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2838) at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2794) at android.app.ActivityThread .handlePauseActivity(ActivityThread.java:2772) 在 android.app.ActivityThread.access$800(ActivityThread.java:130) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206) 在 android.os.Handler.dispatchMessage (Handler.java:99) 在 android.app 的 android.os.Looper.loop(Looper.java:137)。ActivityThread.main(ActivityThread.java:4745) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os。 ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) 原因:java.lang。 IllegalStateException:循环引用错误违规字段:游戏违规对象:preserveType:false,类型:类 djb.ampersands.Ampersands,obj:djb.ampersands.Ampersands@41272778 at com.google.gson.JsonSerializationVisitor.visitObjectField(JsonSerializationVisitor.java:117 ) 在 com.google.gson.ObjectNavigator 的 com.google.gson.ReflectingFieldNavigator.visitFieldsReflectively(ReflectingFieldNavigator.java:69)。在 com.google.gson.JsonSerializationVisitor.addAsChildOfObject(JsonSerializationVisitor.java:127) 在 com.google.gson.JsonSerializationVisitor 接受(ObjectNavigator.java:120) 在 com.google.gson.JsonSerializationVisitor.getJsonElementForChild(JsonSerializationVisitor.java:147) .visitObjectField(JsonSerializationVisitor.java:114) 在 com.google.gson.ReflectingFieldNavigator.visitFieldsReflectively(ReflectingFieldNavigator.java:69) 在 com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:120) 在 com.google.gson。 JsonSerializationVisitor.getJsonElementForChild(JsonSerializationVisitor.java:147) 在 com.google.gson.JsonSerializationVisitor.addAsChildOfObject(JsonSerializationVisitor.java:127) 在 com.google.gson.JsonSerializationVisitor.visitObjectField(JsonSerializationVisitor.java:114) 在 com.google.gson.ReflectingFieldNavigator.visitFieldsReflectively(ReflectingFieldNavigator.java:69) 在 com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:120) 在 com.google.gson.JsonSerializationContextDefault.serialize(JsonSerializationContextDefault.java:62) 在 com .google.gson.BaseMapTypeAdapter.serialize(BaseMapTypeAdapter.java:34) 在 com.google.gson.MapTypeAdapter.serialize(MapTypeAdapter.java:53) 在 com.google.gson.MapTypeAdapter.serialize(MapTypeAdapter.java:33) 在com.google.gson.JsonSerializationVisitor.findAndInvokeCustomSerializer(JsonSerializationVisitor.java:184) 在 com.google.gson.JsonSerializationVisitor.visitFieldUsingCustomHandler(JsonSerializationVisitor.java:204) 在 com.google.gson.ReflectingFieldNavigator.visitFieldsReflectively)(ReflectingFieldNavigator.java:63)在 com.google。gson.ObjectNavigator.accept(ObjectNavigator.java:120) 在 com.google.gson.JsonSerializationContextDefault.serialize(JsonSerializationContextDefault.java:62) 在 com.google.gson.JsonSerializationContextDefault.serialize(JsonSerializationContextDefault.java:53) 在 com.google .gson.Gson.toJsonTree(Gson.java:220) 在 com.google.gson.Gson.toJson(Gson.java:260) 在 com.google.gson.Gson.toJson(Gson.java:240) 在 djb。 ampersands.gui.ComplexPreferences.putObject(ComplexPreferences.java:47) at djb.ampersands.Ampersands.onPause(Ampersands.java:93) at android.app.Activity.performPause(Activity.java:5106) at android.app.Instrumentation .callActivityOnPause(Instrumentation.java:1225) at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2825) ... 12 更多原因:com.google.gson.CircularReferenObjectNavigator.accept(ObjectNavigator.java:120) 在 com.google.gson.JsonSerializationContextDefault.serialize(JsonSerializationContextDefault.java:62) 在 com.google.gson.JsonSerializationContextDefault.serialize(JsonSerializationContextDefault.java:53) 在 com.google.gson .Gson.toJsonTree(Gson.java:220) 在 com.google.gson.Gson.toJson(Gson.java:260) 在 com.google.gson.Gson.toJson(Gson.java:240) 在 djb.ampersands。 gui.ComplexPreferences.putObject(ComplexPreferences.java:47) 在 djb.ampersands.Ampersands.onPause(Ampersands.java:93) 在 android.app.Activity.performPause(Activity.java:5106) 在 android.app.Instrumentation.callActivityOnPause (Instrumentation.java:1225) at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2825) ... 12 更多原因:com.google.gson.CircularReferenObjectNavigator.accept(ObjectNavigator.java:120) 在 com.google.gson.JsonSerializationContextDefault.serialize(JsonSerializationContextDefault.java:62) 在 com.google.gson.JsonSerializationContextDefault.serialize(JsonSerializationContextDefault.java:53) 在 com.google.gson .Gson.toJsonTree(Gson.java:220) 在 com.google.gson.Gson.toJson(Gson.java:260) 在 com.google.gson.Gson.toJson(Gson.java:240) 在 djb.ampersands。 gui.ComplexPreferences.putObject(ComplexPreferences.java:47) 在 djb.ampersands.Ampersands.onPause(Ampersands.java:93) 在 android.app.Activity.performPause(Activity.java:5106) 在 android.app.Instrumentation.callActivityOnPause (Instrumentation.java:1225) at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2825) ... 12 更多原因:com.google.gson.CircularReferen循环参考

由于对象保存不正确,因此在尝试再次加载对象时也会出现错误是有道理的:

java.lang.IllegalArgumentException:使用键保存存储的对象是 djb.ampersands.gui.ComplexPreferences.getObject(ComplexPreferences.java:63) 处的其他类的实例

摘要:当我第一次写这个问题时,我说我无法正确保存/加载任何对象。但是,我现在已经让这种方法适用于某些对象,所以我现在的问题是,它是否可以适用于 Bundle 对象,而答案似乎是否定的......所以我想它又回到了绘图上木板!

4

1 回答 1

3

你不应该完全保存你的包,而应该只保存你的gameState对象。捆绑包的序列化可能比简单的 POJO 更复杂。

由于 lib 使用 Json 序列化事物,它期望一个简单的 POJO,而 Bundle绝对不是简单的 POJO:Bundle 类的某些字段永远不会在 Json 中正确序列化,尤其是类加载器。

于 2012-12-02T07:15:10.873 回答