我有一节课:
public abstract class Thing {
// prevent instantiation outside package. Indeed, no Things will
// ever actually have a runtime class of Thing
Thing(){};
public static Thing create() {
return new SpecialThing1();
}
public static Thing createSpecial() {
return new SpecialThing2();
}
}
final class SpecialThing1 extends Thing {/* etc etc */}
final class SpecialThing2 extends Thing {/* etc etc */}
基本上我希望客户端最终使用的对象是Serializable,并且客户端知道它们将是Serializable。那么哪个类需要实现Serializable?哪个需要serialVersionUID?
答案 0 :(得分:1)
您只需将Thing标记为Serialiable
,这将由SpecialThing1
和SpecialThing2
继承。您没有 将序列版UID添加到任何类中,但建议您这样做;这样您就可以控制客户端和服务器代码之间的类版本控制 - 请参阅相关问题here。
答案 1 :(得分:0)
至少每个实例的派生类最多需要实现Serializable
。如果应该序列化字段,则基类应该实现Serializable
。您可能希望设计串行格式以供将来更改(请参阅Effective Java以进行一些讨论),
实现Serializable
的类,无论是直接还是间接,都应该定义serialVersionUID
。
(注意:外部包将能够创建您的类的实例(通过反序列化 - 串行代理可能是有序的。)将创建方法移到基类之外以减少混淆可能是个好主意。)