文档
ObjectOutputStream说明发生了什么:
对象的默认序列化机制将写入对象的类,类签名以及所有非瞬态和非静态字段的值。对其他对象的引用(在瞬态或静态字段中除外)也导致这些对象也被写入。
使用引用共享机制对单个对象的多个引用进行编码,以便可以将对象的图恢复为与编写原始图时相同的形状。
(我的重点)
例如,如果您对单个对象有多个引用,则在重构图形时,最终会获得对该对象的单个重构版本的多个引用,而不是对该对象的多个等效实例的引用。
当然,如果要序列化的容器实现了另一种机制,则该行为由该机制决定,而不是默认机制。
例如,如果我们有
Thing和
Test:
Thing.java:
import java.io.*;import java.util.*;public class Thing implements Serializable { private Map<String,String> map1; private Map<String,String> map2; public Thing() { this.map1 = new HashMap(); this.map2 = this.map1; // Referring to same object } public void put(String key, String value) { this.map1.put(key, value); } public boolean mapsAreSameObject() { return this.map1 == this.map2; }}
Test.java:
import java.io.*;public class Test implements Serializable { public static final void main(String[] args) { try { // Create a Thing Thing t = new Thing(); t.put("foo", "bar"); // Write it out ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("foo")); os.writeObject(t); os.close(); os = null; // Read it in Thing t2; ObjectInputStream is = new ObjectInputStream(new FileInputStream("foo")); t2 = (Thing)is.readObject(); is.close(); is = null; // Same underlying map for both properties? System.out.println("t2.mapsAreSameObject? " + t2.mapsAreSameObject()); } catch (Exception e) { System.out.println("Exception: " + e.getMessage()); } }}
运行
java Test,我们得到:
t2.mapsAreSameObject?真正
......因为两者
Thing的成员,
map1并
map2最终指向一个
HashMap实例。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)