【发布时间】:2016-06-20 06:11:45
【问题描述】:
我有一堂课:
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.duelsofcodrer.controller.MainActivity$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) 在 java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:959) 在 java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:360) 在 java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1054) 在 java.io.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.duelsofcodrer.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) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
所以我的问题是我怎样才能做到这一点?如何序列化具有接口实例属性的类实例?
更新:
为了更清楚,这是完整的代码:
(我从MyEntity 和MyInterface 制作了内部类以使其更加简化。)
package com.adamvarhegyi.duelsofcodrer.controller;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import com.adamvarhegyi.duelsofcodrer.R;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class MainActivity extends Activity {
public interface MyInterface extends Serializable {
void customFunction(int 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;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
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
}
};
//Trying to serialize
try {
FileOutputStream fos = openFileOutput("myfile", Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(myEntity);
oos.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
【问题讨论】:
-
你做对了吗?
-
@RafaelCardoso 不,您的建议我仍然有例外。可以试试这个方法是否有效?
-
@RafaelCardoso 我已经用完整的代码更新了这个问题。
-
亚当,请阅读:stackoverflow.com/questions/7144912/…。序列化内部类存在问题。尝试将它们移动到单独的文件并返回结果;)
-
@RafaelCardoso 好吧,这些类在单独的包中,我只是将它们移到活动中以完整地发布代码。所以错误仍然存在。很遗憾。
标签: java android serialization interface