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);
}
据我了解 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);
}