java序列化接口
我正在尝试序列化具有接口的构造函数中的对象,我将解释:
这是对象类:
public class MyObj implements Serializable{
private static final long serialVersionUID = -29238982928391L;
private MyCallback onMyCallback;
private String shortcutsText;
public MyObj(String shortcutsText, MyCallback onMyCallback){
this.shortcutsText = shortcutsText;
this.onMyCallback = onMyCallback;
}
public MyCallback getOnMyCallback() {
return onMyCallback;
}
}
这是MyCallback接口:
public interface MyCallback extends Serializable {
long serialVersionUID = -1306760703066967345L;
void onMyCallbackClickListener();
}
但是当我尝试用(out
isObjectOutputStream
)编写它时:
MyCallback myCallback = new MyCallback() {
@Override
public void onMyCallbackClickListener() {
Toast.makeText(getApplicationContext(), "TEST!", Toast.LENGTH_LONG).show();
}
};
out.writeObject(myCallback);
或与:
out.writeObject(new MyObj("Test", myCallback));
它抛出:
java.io.NotSerializableException
# 1 楼答案
“强烈反对内部类(即非静态成员类的嵌套类)的序列化,包括本地类和匿名类”。所以,你不能这样写:
MyCallback myCallback = new MyCallback() { @Override public void onMyCallbackClickListener() { Toast.makeText(getApplicationContext(), "TEST!", Toast.LENGTH_LONG).show(); } };
# 2 楼答案
interface
或abstract class
无法序列化,只有实现java.io.Serializable
和基元类型的具体类才能序列化。序列化用于传输信息/数据。尽管您可以编写如下内容,但这并不意味着您可以序列化接口实际上是具体的类
MyCallbackImpl
被序列化了。从输出可以看出:正如其他答案所提到的,根据详细解释here,匿名类、本地类和非静态内部类无法序列化
# 3 楼答案
匿名内部类不可序列化。请参见此处的详细说明:NotSerializableException on anonymous class
# 4 楼答案
出现此异常是因为无法序列化匿名内部类