【发布时间】: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