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
原创粉丝点击