2016-07-22 81 views
1

我的不可变类(最后所有字段)都包含对第三方类的对象的引用,该对象不会执行Serializable。通常的解决方法是(如How to serialize a non-serializable in Java?的接受答案中所述)使用writeObjectreadObject方法创建自定义序列化格式。但是,readObject无法更新final字段,因为它不是构造函数。我见过使用readResolve来解决这个问题的suggestion,但是看不到如何工作,因为我没有看到如何获得初始化最终字段到该方法所需的数据(它显然只能访问字段,我已经初始化了,而且我真的不想在对象被假定为完全不可变的时候,在对象中创建一个新的可变字段用于临时使用。)那么我怎么才能让我的反序列化工作?如何序列化包含不可序列化对象的最终字段

public class ThisDoesntWork implements Serializable 
{ 
    private final transient SomeNonSerializableClass object; 
    private void writeObject (ObjectOutputStream out) throws IOException 
    { 
     out.writeUTF (object.toString()); 
    } 
    private void readObject (ObjectInputStream in) throws IOException 
    { 
     object = SomeNonSerializableClass.fromString(in.readUTF()); // error! 
    } 
} 
+0

您可以删除'final'关键字。即使你删除了它,你的类仍然是不可变的,因为你控制了对该字段的所有访问。这就是你封装字段的原因。出于文档目的,您可以将“final”作为评论留下,例如'private/* final */MyObject myObj'。 – Andreas

回答

2

可以使用writeReplace()不同(代理)类的一个对象,和向readResolve()构建一个从在该代理的值的原始类的对象。构造函数可以设置最终字段。