栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如果两个对象引用指向同一个可序列化的对象,则在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
实例。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/507893.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号