保存捆绑与Android复杂的preferences(JSON) [英] Saving Bundle with Android ComplexPreferences (JSon)

查看:187
本文介绍了保存捆绑与Android复杂的preferences(JSON)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是从这里开始的后续问题:保存捆绑到共享preferences

This is a follow-on question from here: Save Bundle to SharedPreferences

我试图用复杂的preferences类从上述线程保存一个Bundle对象在我的Andr​​oid应用程序,但都无济于事!这里是code我使用保存和加载数据到复杂的preferences(大致相同的下载页面复杂preferences类的示例):

I am trying to use the ComplexPreferences class from the aforementioned thread to save a Bundle object in my Android app, but to no avail! Here is the code I'm using to save and load the data to ComplexPreferences (much the same as in the example on the download page for the ComplexPreferences class):

1级:

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);

这个问题似乎保存对象复杂preferences时要。这里是堆栈跟踪运行上述code,当我得到:

The problem appears to be when saving the object to ComplexPreferences. Here is the stack trace I get when running the above code:

致命异常:主要了java.lang.RuntimeException:无法暂停
  活动{djb.ampersands / djb.ampersands.Ampersands}:
  java.lang.IllegalStateException:循环引用错误犯规
  现场:游戏违犯的对象:preserveType:假的,类型:类
  djb.ampersands.Ampersands,OBJ:djb.ampersands.Ampersands@41272778在
  android.app.ActivityThread.performPauseActivity(ActivityThread.java:2838)
    在
  android.app.ActivityThread.performPauseActivity(ActivityThread.java:2794)
    在
  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.os.Looper.loop(Looper.java:137)在
  android.app.ActivityThread.main(ActivityThread.java:4745)在
  java.lang.reflect.Method.invokeNative(本机方法)的
  java.lang.reflect.Method.invoke(Method.java:511)在
  com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)
    在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)在
  dalvik.system.NativeStart.main(本机方法)所造成的:
  java.lang.IllegalStateException:循环引用错误犯规
  现场:游戏违犯的对象:preserveType:假的,类型:类
  djb.ampersands.Ampersands,OBJ:djb.ampersands.Ampersands@41272778在
  com.google.gson.JsonSerializationVisitor.visitObjectField(JsonSerializationVisitor.java:117)
    在
  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.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.Complex preferences.putObject(复杂preferences.java:47)
    在djb.ampersands.Ampersands.onPause(Ampersands.java:93)在
  android.app.Activity.performPause(Activity.java:5106)在
  android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1225)
    在
  android.app.ActivityThread.performPauseActivity(ActivityThread.java:2825)
    ... 12条更多引起:com.google.gson.CircularReferen

FATAL EXCEPTION: main java.lang.RuntimeException: Unable to pause activity {djb.ampersands/djb.ampersands.Ampersands}: java.lang.IllegalStateException: circular reference error Offending field: game Offending object: preserveType: false, type: class 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) at android.app.ActivityThread.access$800(ActivityThread.java:130) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at 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) Caused by: java.lang.IllegalStateException: circular reference error Offending field: game Offending object: preserveType: false, type: class djb.ampersands.Ampersands, obj: djb.ampersands.Ampersands@41272778 at com.google.gson.JsonSerializationVisitor.visitObjectField(JsonSerializationVisitor.java:117) at com.google.gson.ReflectingFieldNavigator.visitFieldsReflectively(ReflectingFieldNavigator.java:69) at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:120) at com.google.gson.JsonSerializationVisitor.getJsonElementForChild(JsonSerializationVisitor.java:147) at com.google.gson.JsonSerializationVisitor.addAsChildOfObject(JsonSerializationVisitor.java:127) at com.google.gson.JsonSerializationVisitor.visitObjectField(JsonSerializationVisitor.java:114) at com.google.gson.ReflectingFieldNavigator.visitFieldsReflectively(ReflectingFieldNavigator.java:69) at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:120) at com.google.gson.JsonSerializationVisitor.getJsonElementForChild(JsonSerializationVisitor.java:147) at com.google.gson.JsonSerializationVisitor.addAsChildOfObject(JsonSerializationVisitor.java:127) at com.google.gson.JsonSerializationVisitor.visitObjectField(JsonSerializationVisitor.java:114) at com.google.gson.ReflectingFieldNavigator.visitFieldsReflectively(ReflectingFieldNavigator.java:69) at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:120) at com.google.gson.JsonSerializationContextDefault.serialize(JsonSerializationContextDefault.java:62) at com.google.gson.BaseMapTypeAdapter.serialize(BaseMapTypeAdapter.java:34) at com.google.gson.MapTypeAdapter.serialize(MapTypeAdapter.java:53) at com.google.gson.MapTypeAdapter.serialize(MapTypeAdapter.java:33) at com.google.gson.JsonSerializationVisitor.findAndInvokeCustomSerializer(JsonSerializationVisitor.java:184) at com.google.gson.JsonSerializationVisitor.visitFieldUsingCustomHandler(JsonSerializationVisitor.java:204) at com.google.gson.ReflectingFieldNavigator.visitFieldsReflectively(ReflectingFieldNavigator.java:63) at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:120) at com.google.gson.JsonSerializationContextDefault.serialize(JsonSerializationContextDefault.java:62) at com.google.gson.JsonSerializationContextDefault.serialize(JsonSerializationContextDefault.java:53) at com.google.gson.Gson.toJsonTree(Gson.java:220) at com.google.gson.Gson.toJson(Gson.java:260) at com.google.gson.Gson.toJson(Gson.java:240) at 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 more Caused by: com.google.gson.CircularReferen

由于对象保存不当,这是有道理的尝试再次加载该对象时,我也得到一个错误:

Since the object was saved incorrectly, it makes sense that I also get an error when trying to load the object again:

java.lang.IllegalArgumentException异常:对象与存储1键保存为
  在的instanceof类等
  djb.ampersands.gui.Complex preferences.getObject(复杂preferences.java:63)

java.lang.IllegalArgumentException: Object storaged with key save is instanceof other class at djb.ampersands.gui.ComplexPreferences.getObject(ComplexPreferences.java:63)

摘要::当我第一次写这个问题,我说我不能得到任何对象正确保存/载入。不过,我现在已经得到了该方法对某些对象的工作,所以我真的现在的问题是,可以将其以往任何时候都捆绑对象的工作,而答案,它会出现,就是没有...所以我想这是回到绘图板!

Summary: When I first wrote this question, I said I couldn't get any objects to save/load correctly. However, I have now got this method to work for some objects, so really my question now is, can it ever work for Bundle objects, and the answer, it would appear, is no... so I guess it's back to the drawing board!

推荐答案

您不该救你的包完全,但只有你的游戏状态对象。束可能会更复杂的比一个简单的POJO序列化。

You should not save your bundle entirely but only your gameState object. Bundles might be more complex to serialize than a simple POJO.

由于LIB使用JSON序列化的东西,它需要一个简单的POJO和捆绑<一个href=\"http://grep$c$c.com/file/repository.grep$c$c.com/java/ext/com.google.android/android/2.0_r1/android/os/Bundle.java\"相对=nofollow>绝对不是简单的POJO 的:捆绑类的某些领域将永远不会以JSON序列正确,尤其是类加载器

As the lib uses Json to serialize things, it expects a simple POJO and Bundles are definitely not simple POJOs : some fields of the Bundle class will never be serialized correctly in Json, especially the class loader.

这篇关于保存捆绑与Android复杂的preferences(JSON)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆