如果两个对象引用指向同一个可序列化的对象,则在Java的序列化过程中会发生什么?

如果两个对象引用指向同一个可序列化的对象,则在Java的序列化过程中会发生什么?,第1张

如果两个对象引用指向同一个可序列化的对象,则在Java的序列化过程中会发生什么?

文档

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
实例。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5500270.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存