Java 要初始化瞬态场,最简单的解决方案是什么

Java 要初始化瞬态场,最简单的解决方案是什么,java,serialization,Java,Serialization,当我还原这个类时,我想手动初始化myTransient,否则我只想使用默认的序列化 如何将init()方法注入对象还原过程,而不重新编写整个序列化机制,就像Externalizable让我做的那样?实现readObject()方法: class MyClass implements Serializable { transient int myTransient; //Other variables } 从javadoc: 在序列化和反序列化过程中需要特殊处理的类必须使用以下精确签名实

当我还原这个类时,我想手动初始化
myTransient
,否则我只想使用默认的序列化


如何将
init()
方法注入对象还原过程,而不重新编写整个序列化机制,就像
Externalizable
让我做的那样?

实现
readObject()
方法:

class MyClass implements Serializable {
  transient int myTransient;
  //Other variables
}
从javadoc:

在序列化和反序列化过程中需要特殊处理的类必须使用以下精确签名实现特殊方法:

私有void readObject(java.io.ObjectInputStream-in) 抛出IOException,ClassNotFoundException

readObject方法负责从流中读取并恢复类字段。它可以调用in.defaultReadObject来调用用于恢复对象的非静态和非瞬态字段的默认机制。defaultReadObject方法使用流中的信息将保存在流中的对象的字段与当前对象中相应命名的字段一起分配。这将处理类进化为添加新字段的情况。该方法不需要关心属于其超类或子类的状态。通过使用writeObject方法或使用DataOutput支持的基本数据类型的方法将各个字段写入ObjectOutputStream来保存状态

另请参见:


如果需要默认实现中未包含的某些功能,您可以定义自己的序列化,但readObject应该足以用于变量初始化。我想到了延迟初始化。这里有两个问题。如果不使用锁定,变量可能会被初始化多次。如果你锁定,它可能会减慢你的应用程序。请参阅延迟初始化的双重检查锁定:。axtavt的解决方案更好。
private void readObject(java.io.ObjectInputStream in)
    throws IOException, ClassNotFoundException {
    in.defaultReadObject();
    myTransient = ...;
}