2009-06-26 101 views
0

我有一类事情:在这种Java情况下需要哪些序列化?

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?哪些需要serialVersionUID?

回答

0

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

实现Serializable的所有类,无论是直接还是间接,都应该定义serialVersionUID。 (注意:外部包可以创建你的类的实例(通过反序列化 - 一个序列化代理可能是有序的)将创建方法移到基类之外可能是一个不错的主意混淆)。

1

您只需要标记物品为Serialiable,这将由SpecialThing1SpecialThing2继承。您不需要已将添加到任何类的串行版本UID,但建议您这样做;这样你可以控制客户端和服务器代码之间的类的版本控制 - 参见相关问题here

相关问题