Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Gson序列化具有作为私有成员的上下文的自定义对象?_Java_Android_Serialization_Gson - Fatal编程技术网

Java 如何使用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

我有一个自定义对象的ArrayList,我正试图使用Gson将其作为JSON字符串存储到磁盘。这对于只包含基本类型的数据(如字符串)的对象非常有用,但我有一个类有一个私有成员来存储活动的上下文。当我尝试使用Gson序列化该类时,出现以下异常:

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-我理解序列化在反序列化过程中将不再使用的上下文是没有意义的。问题不在于我需要上下文(我总是可以按照建议手动设置),而在于我已经在一个复杂的应用程序中嵌入了一个复杂的类,如果不需要的话,我只是想避免很多重构。我只是不确定是否有办法让格森优雅地处理这类事情。如果我必须在序列化过程中排除上下文并手动设置它,那么如果这是处理此问题的唯一方法,那么就可以了。