如何序列化包含不可序列化对象的最终字段

时间:2016-07-22 22:38:53

标签: java serialization immutability

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

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!
   }
}

1 个答案:

答案 0 :(得分:2)

您使用writeReplace()来编写不同(代理)类的对象,并使用readResolve()构造原始类的对象来自代理中的值。构造函数可以设置最终字段。