Java 如何使用Gson序列化具有作为私有成员的上下文的自定义对象?
我有一个自定义对象的ArrayList,我正试图使用Gson将其作为JSON字符串存储到磁盘。这对于只包含基本类型的数据(如字符串)的对象非常有用,但我有一个类有一个私有成员来存储活动的上下文。当我尝试使用Gson序列化该类时,出现以下异常:Java 如何使用Gson序列化具有作为私有成员的上下文的自定义对象?,java,android,serialization,gson,Java,Android,Serialization,Gson,我有一个自定义对象的ArrayList,我正试图使用Gson将其作为JSON字符串存储到磁盘。这对于只包含基本类型的数据(如字符串)的对象非常有用,但我有一个类有一个私有成员来存储活动的上下文。当我尝试使用Gson序列化该类时,出现以下异常: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxxx.xxxx/com.xxxx.xxxx.MainActivity}: java.lang.Security
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxxx.xxxx/com.xxxx.xxxx.MainActivity}: java.lang.SecurityException: Can't make method constructor accessible
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.SecurityException: Can't make method constructor accessible
at java.lang.reflect.Constructor.setAccessible(Constructor.java:336)
at com.google.gson.internal.ConstructorConstructor.newDefaultConstructor(ConstructorConstructor.java:101)
at com.google.gson.internal.ConstructorConstructor.get(ConstructorConstructor.java:83)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:96)
at com.google.gson.Gson.getAdapter(Gson.java:407)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:136)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:49)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:106)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:105)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:161)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:97)
at com.google.gson.Gson.getAdapter(Gson.java:407)
at com.google.gson.internal.bind.ArrayTypeAdapter$1.create(ArrayTypeAdapter.java:48)
at com.google.gson.Gson.getAdapter(Gson.java:407)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:136)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:49)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:106)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:105)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:161)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:97)
at com.google.gson.Gson.getAdapter(Gson.java:407)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:136)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:49)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:106)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:105)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:161)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:97)
at com.google.gson.Gson.getAdapter(Gson.java:407)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:136)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:49)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(Refle
上下文
不可序列化。您应该将变量声明为transient
,以防止它被序列化。当然,反序列化时应该手动分配它
public class MyObject {
private transient Context context;
// ... other fields here
public MyObject() {
}
public void setContext(Context context) {
this.context = context;
}
}
上下文
不可序列化。您应该将变量声明为transient
,以防止它被序列化。当然,反序列化时应该手动分配它
public class MyObject {
private transient Context context;
// ... other fields here
public MyObject() {
}
public void setContext(Context context) {
this.context = context;
}
}
更重要的是,如果您确实以某种方式序列化了它,那么它将无法作为序列化另一端的有效上下文。OP几乎肯定是做错了什么。@Gabeschen我不确定,但似乎Gson存在某种问题(请参阅)。从构造函数参数中删除上下文可能会解决这种情况下的问题。@Gabeschen-我理解序列化在反序列化过程中将不再使用的上下文是没有意义的。问题不在于我需要上下文(我总是可以按照建议手动设置),而在于我已经在一个复杂的应用程序中嵌入了一个复杂的类,如果不需要的话,我只是想避免很多重构。我只是不确定是否有办法让格森优雅地处理这类事情。如果我必须在序列化过程中排除上下文并手动设置它,如果这是处理此问题的唯一方法,那也没关系。更重要的是,如果您以某种方式序列化了它,它将无法作为序列化另一端的有效上下文。OP几乎肯定是做错了什么。@Gabeschen我不确定,但似乎Gson存在某种问题(请参阅)。从构造函数参数中删除上下文可能会解决这种情况下的问题。@Gabeschen-我理解序列化在反序列化过程中将不再使用的上下文是没有意义的。问题不在于我需要上下文(我总是可以按照建议手动设置),而在于我已经在一个复杂的应用程序中嵌入了一个复杂的类,如果不需要的话,我只是想避免很多重构。我只是不确定是否有办法让格森优雅地处理这类事情。如果我必须在序列化过程中排除上下文并手动设置它,那么如果这是处理此问题的唯一方法,那么就可以了。