在这种Java情况下,什么需要Serializable?

时间:2009-06-26 15:10:42

标签: java serialization

我有一节课:

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?

2 个答案:

答案 0 :(得分:1)

您只需将Thing标记为Serialiable,这将由SpecialThing1SpecialThing2继承。您没有 将序列版UID添加到任何类中,但建议您这样做;这样您就可以控制客户端和服务器代码之间的类版本控制 - 请参阅相关问题here

答案 1 :(得分:0)

至少每个实例的派生类最多需要实现Serializable。如果应该序列化字段,则基类应该实现Serializable。您可能希望设计串行格式以供将来更改(请参阅Effective Java以进行一些讨论),

实现Serializable的类,无论是直接还是间接,都应该定义serialVersionUID

(注意:外部包将能够创建您的类的实例(通过反序列化 - 串行代理可能是有序的。)将创建方法移到基类之外以减少混淆可能是个好主意。)