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

How to serialize a final field containing a non-serializable object

我的不可变 class(所有字段最终)包含对未实现 Serializable 的第 3 方 class 对象的引用。通常的解决方法是(如 How to serialize a non-serializable in Java?) to use the writeObject and readObject methods to create a custom serialization format. However, readObject is unable to update final fields because it isn't a constructor. I've seen a 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!
   }
}

您使用writeReplace()写了一个不同(代理)的对象class,readResolve()根据代理中的值构造 原始class 的对象。构造函数可以设置final字段。