【问题标题】:How to serialize a final field containing a non-serializable object如何序列化包含不可序列化对象的最终字段
【发布时间】:2016-07-22 22:38:53
【问题描述】:

我的不可变类(所有字段为 final)包含对未实现 Serializable 的第 3 方类对象的引用。通常的解决方法是(如How to serialize a non-serializable in Java? 的接受答案中所述)使用writeObject 和readObject 方法来创建自定义序列化格式。但是,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!
   }
}

【问题讨论】:

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

标签: java serialization immutability


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2021-04-22
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多