Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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 如何序列化具有接口实例属性的类?获取NotSerializableException_Java_Android_Serialization_Interface - Fatal编程技术网

Java 如何序列化具有接口实例属性的类?获取NotSerializableException

Java 如何序列化具有接口实例属性的类?获取NotSerializableException,java,android,serialization,interface,Java,Android,Serialization,Interface,我有一门课: public class MyEntity implements Serializable { public MyInterface myInterface; public String name; public int value; public MyEntity(String name, int value) { this.name = name; this.value = value; } }

我有一门课:

public class MyEntity implements Serializable {

    public MyInterface myInterface;

    public String name;
    public int    value;

    public MyEntity(String name, int value) {
        this.name = name;
        this.value = value;
    }
}
和一个接口:

public interface MyInterface {
    void customFunction(int value);
}
此结构的要点是实现以下目的:MyClass的每个实例都可以有不同的customFunction(value)实现。

就像:

MyEntity myEntity = new MyEntity("My entity", 100);
    myEntity.myInterface = new MyInterface() {
        @Override
        public void customFunction(int value) {
            //This is my custom function.
            //This can be different for every instance of MyEntity class
        }
    };
但是,如果我想序列化MyClass的实例,我会得到NotSerializableException

java.io.NotSerializableException: com.adamvarhegyi.duelsofcdrer.controller.main活动$1位于 java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1344) 在 java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651) 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497) 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461) 在 ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:959) 在 java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:360) 在 ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1054) 在 ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1384) 在 java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651) 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497) 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461) 在 com.adamvarhegyi.duelsofcdrer.controller.MainActivity.onCreate(MainActivity.java:62) 在android.app.Activity.performCreate(Activity.java:6251)中 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 位于android.app.ActivityThread.-wrap11(ActivityThread.java)处 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 位于android.os.Handler.dispatchMessage(Handler.java:102) Looper.loop(Looper.java:148)位于 android.app.ActivityThread.main(ActivityThread.java:5417)位于 java.lang.reflect.Method.invoke(本机方法)位于 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

所以我的问题是我如何才能做到这一点?如何使用接口实例属性序列化类实例

更新:

以下是完整的代码,以使其更清晰:

(我从
MyEntity
MyInterface
中创建了内部类,使其更加简化。)


当您将类定义为
公共类MyEntity实现可序列化时
,您基本上定义了
MyEntity
的所有属性都应该是可序列化的。但是,
MyInterface
不是,因此,属性
public MyInterface-MyInterface
无法序列化,您将获得
notserializableeexception

要解决这个问题,您的接口应该是一个可序列化的instance,因此它应该扩展它

public interface MyInterface extends Serializable 
{
    void customFunction(int value);
}
这样,
MyEntity
将使所有属性都可序列化,并且不会抛出错误。需要注意的是,所有基本数据类型(如
int
float
等)都可以序列化,也可以序列化
字符串

编辑 在反复思考、阅读和重读代码之后,我发现了您的问题。当您执行以下操作时:

myEntity.myInterface = new MyInterface() {
    @Override
    public void customFunction(int value) {
        //This is my custom function.
        //This can be different for every instance of MyEntity class
    }
};
实际上,您正在创建一个全新的无名的内部类,它实现了
MyInterface
。但是,由于这是一个内部类,因此它引用其父类
Activity
。活动是不可序列化的,因此它会抛出
NotSerializableException

如何解决这个问题

您将无法创建可序列化的自定义类。然而,有一条出路

您可以在一个单独的文件中创建一个新类(例如名为
CustomInterfaceImplementation
),并创建它的实例,或者为
活动创建一个内部类,即
静态
(请注意,此活动不会在
onCreate()中创建)
方法,因为这没有任何意义。它应该在任何方法的作用域之外和
活动的作用域之内创建

例如,你可以有这样的东西:

CustomInterfaceImplementation customImpl = new CustomInterfaceImplementation();
myEntity.myInterface = customImpl;
上面的代码可以工作,它是
CustomInterfaceImplementation
MainActivity
中的static类或单独的公共java类

但是,如果我想在不同的obj中进行即时课程,该怎么办


正如我所说的,很难创建可序列化的全新类。然而,您可以提取所有可能实现之间的所有公共代码,并只传递可能发生变化的变量。这样,您就可以保持可序列化的特性,并且可以实现您的目标。

使MyInterface可序列化,或者像这样向MyInterface添加瞬态:

    public class MyEntity implements Serializable {
        public transient MyInterface myInterface;
        // ...
    }

使myInterface成为瞬态会将变量标记为未序列化。

如果我尝试简单地将“implements Serializable”写入接口,就像写入类一样,我会收到错误消息。“接口不允许使用implements子句”如何使接口可序列化?@AdamVarhegyi很抱歉,它应该是
extends
而不是
implements
,因为接口继承自其他接口,我仍然得到了异常,你能试试这个方法看看它是否真的有效吗?@AdamVarhegyi你能发布你的项目结构吗?比如,你的文件是如何处理的?是的,它正在工作。谢谢你的努力,拉斐尔。你做对了吗?@RafaelCardoso不,你的建议我也有例外。你能试试这个方法吗
    public class MyEntity implements Serializable {
        public transient MyInterface myInterface;
        // ...
    }