java序列化之后,对象的引用关系?
来源:互联网 发布:ios socket多线程编程 编辑:程序博客网 时间:2024/05/20 11:25
今天写代码的时候用到序列化,不过突然想到这个问题。
于是写了一些测试代码,得出两个结论。
如果两个对象存在引用关系,比如A引用B。
如果两个对象是各自序列化的,则引用关系不再存在。
如果两个对象是是另一个类对象C的成员,序列化C,反序列化C之后,A和B的引用关系还存在。
我就是做了这个两个实验。
1 node2引用了node1,node2.parent=node1,
序列化和反序列化之后,
发现node2.parent !=node1。
node2.parent 指向的内存跟node1不同,而是另外在内存生成了一个对象。
2 Tree有两个成员,node1和node2,
node2引用了node1,node2.parent=node1,
序列化和反序列化之后,
node2.parent =node1。
数据结构定义:
class node implements Serializable{/** * */private static final long serialVersionUID = -8475920991534073160L;node parent;int id;public node(int i){id = i;parent= null;}}//nodeTree,node1和node2存在引用关系class nodeTree implements Serializable{node node1;node node2;public nodeTree(){node1 = new node(1);node2 = new node(2);node2.parent = node1;}public void test(){ if(node1 ==node2.parent) System.out.println("node1 = node2.parent!"); else System.out.println("node1 !=node2.parent!"); if(node1.parent == null) System.out.println("node1's parent is null"); else System.out.println("node1's parent is "+node1.parent.id); if(node2.parent == null) System.out.println("node2's parent is null"); else System.out.println("node2's parent is "+node2.parent.id);}}
测试代码:
public class Serial2 {//序列化 nodeTree,node1和node2的引用关系存在public void test() throws IOException, ClassNotFoundException{nodeTree tree = new nodeTree();tree.test(); FileOutputStream fos = new FileOutputStream("temp1.out"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(tree); oos.flush(); oos.close(); FileInputStream fis = new FileInputStream("temp1.out"); ObjectInputStream oin = new ObjectInputStream(fis); tree = (nodeTree) oin.readObject(); System.out.println("序列化和反序列化之后"); tree.test();}//各自序列化node1和node2,之间的引用关系不存在public void test2() throws IOException, ClassNotFoundException{node node1 = new node(1);node node2 = new node(2);node2.parent = node1; System.out.println(node1.id); System.out.println(node2.id); if(node1 ==node2.parent) System.out.println("node1 = node2.parent!"); else System.out.println("node1 !=node2.parent!"); if(node1.parent == null) System.out.println("node1's parent is null"); else System.out.println("node1's parent is "+node1.parent.id); if(node2.parent == null) System.out.println("node2's parent is null"); else System.out.println("node2's parent is "+node2.parent.id); //序列化 FileOutputStream fos = new FileOutputStream("temp1.out"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(node1); oos.flush(); oos.close(); fos = new FileOutputStream("temp2.out"); oos = new ObjectOutputStream(fos); oos.writeObject(node2); oos.flush(); oos.close(); //反序列化 FileInputStream fis = new FileInputStream("temp1.out"); ObjectInputStream oin = new ObjectInputStream(fis); node1 = (node) oin.readObject(); fis = new FileInputStream("temp2.out"); oin = new ObjectInputStream(fis); node2 = (node) oin.readObject(); System.out.println("--------------------------------"); System.out.println("序列化和反序列化之后"); System.out.println(node1.id); System.out.println(node2.id); if(node1 ==node2.parent) System.out.println("node1 = node2.parent!"); else System.out.println("node1 !=node2.parent!"); if(node1.parent == null) System.out.println("node1's parent is null"); else System.out.println("node1's parent is "+node1.parent.id); if(node2.parent == null) System.out.println("node2's parent is null"); else System.out.println("node2's parent is "+node2.parent.id); }public static void main(String[] args) throws ClassNotFoundException, IOException {// TODO Auto-generated method stubSerial2 test = new Serial2();//test.test();test.test2();}}
test()的输出结构:
node1 = node2.parent!node1's parent is nullnode2's parent is 1序列化和反序列化之后node1 = node2.parent!node1's parent is nullnode2's parent is 1
test2()的输出结果:
12node1 = node2.parent!node1's parent is nullnode2's parent is 1--------------------------------序列化和反序列化之后12node1 !=node2.parent!node1's parent is nullnode2's parent is 1
本文作者:linger
本文链接:http://blog.csdn.net/lingerlanlan/article/details/38087601
0 0
- java序列化之后,对象的引用关系?
- 序列化---对象引用的序列化
- java 类对象引用关系
- 引用与对象的关系
- JAVA引用和对象的关系_还有值传递
- 从关键字说Java对象、引用、指针、堆栈的关系
- [疯狂Java]I/O:I/O流的最高境界——对象流(序列化:手动序列化、自动序列化、引用序列化、版本)
- JAVA的对象序列化
- JAVA的对象序列化
- java的对象序列化
- Java对象的序列化
- Java 的对象序列化
- Java对象的序列化
- Java对象的序列化
- Java对象的序列化
- Java:对象的序列化
- Java对象的序列化
- Java对象的序列化
- 用mkfs.jffs2 命令制作jffs2镜像文件
- CentOS虚拟机安装SAMBA服务器 实现与Windows宿主机文件共享
- python软件工程师面试题
- 查找两个表同样属性列下更新了的内容
- KVZ "KOF V.S. Zombies" Demo
- java序列化之后,对象的引用关系?
- java大整数模板
- Swift源码分析----swift-account-audit(2)
- 直接影响网站外链质量的十大要素
- 7/24
- style Devices and Displays
- HDU 1262 寻找素数对
- HDU 1213 How Many Tables(并查集)
- 苹果亮绿灯 iOS 8将支持第三方输入法