我想用这个建议补充@Brian Agnew 的回答:
我有一个案例,我需要一个对象的行为略有不同,所以我用匿名内部类扩展了它的功能,就像你在示例中所做的那样。外部类是一个 GUI 应用程序,我没有使其可序列化,因为这不是必需的,因此就像@Brian 所说,没有匿名内部类可以序列化,即使它们扩展的类是可序列化的。
在这种情况下,您只需为反序列化类和再次序列化类定义不同的行为。如果您有一个具有特定构造函数的类,请在您的类中使用如下方法:
public FunctionalObject getNewFunctionalObject (String param1, String param2) {
// Use an anonymous inner class to extend the behavior
return new FunctionalObject (param1, param2) {
{
// Initialization block code here
}
// Extended behavior goes here
};
}
所以当你反序列化时,你可以这样调用:
FunctionalObject fo = (FunctionalObject) objectInputStream.readObject ();
fo = getNewFunctionalObject(fo.getParam1(), fo.getParam2());
序列化时,您需要创建一个new
对象,它是旧对象的克隆。有些类内置了这种行为,而在其他类中,您必须专门定义它。对于序列化,如果你有一个可以克隆它的构造函数,或者你的类clone
定义了方法,你可以这样做:
objectOutputStream.writeObject ( fo.clone() );
然后,该clone
对象的 将不再是对匿名内部类的引用,而是对对象的实际副本的引用,该副本是可序列化的。
在您的示例中,您可以这样做:
// Assuming objectOutputStream has already been defined
Map<String, String> params = new HashMap<String, String>() {{
put("param1", "value1");
put("param2", "value2");
}};
objectOutputStream.writeObject (new HashMap<String,String> (params));
这是有效的,因为HashMap
该类有一个构造函数,它将返回HashMap
传递给它的任何内容的克隆。说一些简单的话是很多话,但我希望我自己能早点得到这个建议。