Java 瞬态字段如何反序列化回其原始值?

How can the Java Transient fields be de-serialized back to their original values?

据我了解 Java 的瞬态和静态字段 当对象在源中被序列化时,对象被 JVM 阻止序列化。序列化后如何在对象在目的地反序列化时将这些字段恢复为原始值?

How can the Java Transient fields be de-serialized back to their original values?

它们不能反序列化:根据定义,它们不包含在实例的序列化表示中。

而是重新计算它们。


这方面的一个例子是 internal map in HashSet。没有实际需要存储 Set; 内容的“映射性”;甚至不需要存储“集合”(例如,没有重复的事实)。

HashSet 的序列化表示只是元素 - 它看起来很像序列化数组 - 它只是 one object after another.

// From HashSet.writeObject():

// Write out all elements in the proper order.
for (E e : map.keySet())
  s.writeObject(e);

反序列化时,these objects are read one-by-one,放入Map:

// From HashSet.readObject():

// Read in all elements in the proper order.
for (int i=0; i<size; i++) {
  @SuppressWarnings("unchecked")
    E e = (E) s.readObject();
  map.put(e, PRESENT);
}