java序列化之后,对象的引用关系?

今天写代码的时候用到序列化,不过突然想到这个问题。

于是写了一些测试代码,得出两个结论。

如果两个对象存在引用关系,比如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 stub
		Serial2 test = new Serial2();
		//test.test();
		test.test2();
	}

}

test()的输出结构:

node1 = node2.parent!
node1's parent is null
node2's parent is 1
序列化和反序列化之后
node1 = node2.parent!
node1's parent is null
node2's parent is 1

test2()的输出结果:

1
2
node1 = node2.parent!
node1's parent is null
node2's parent is 1
--------------------------------
序列化和反序列化之后
1
2
node1 !=node2.parent!
node1's parent is null
node2's parent is 1

java序列化之后,对象的引用关系?,布布扣,bubuko.com

时间: 2024-10-29 19:11:20

java序列化之后,对象的引用关系?的相关文章

浅谈Java中的对象和引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: "按照通

“吃人”的那些Java名词:对象、引用、堆、栈

记得中学的课本上,有一篇名为<狂人日记>课文:那时候根本理解不了鲁迅写这篇文章要表达的中心思想,只觉得满篇的"吃人"令人心情压抑:老师在讲台上慷慨激昂的讲,大多数的同学同我一样,在课本面前"痴痴"的发呆. 作为一个有着8年Java编程经验的IT老兵,说起来很惭愧,我被Java当中的四五个名词一直困扰着:对象.引用.堆.栈.堆栈(栈可同堆栈,因此是四个名词,也是五个名词).每次我看到这几个名词,都隐隐约约觉得自己在被一只无形的大口慢慢地吞噬,只剩下满地的衣

Java序列化与对象流浅谈

今晚又重新回顾了Java中序列化与对象流的知识,接触了一位有着上亿行有效代码量的大佬之思想,2333. 1.序列化与反序列化 Java中的序列化简而言之就是为了避免要重复使用的实例在每次执行程序过程中都要重新申请堆空间,序列化后直接加载,节约时间.序列化过程中,保存在文件中的对象只记录了对象的状态(属性),包括成员和类类型(名称),而不会存储对象的方法.可看做将一个有着灵魂的人进行灵魂转移,转移的只是他的记忆,他自己的各种行为,比如吃饭.睡觉--,每个人都拥有,且行为表现一样,即只需转移(保存)

Java数据类型和对象的引用

在Java中,变量分为两类: 1.基本类型变量,java是传递的副本 2.一切对象型变量,传引用副本的实质是复制指向地址的指针 a.基本类型引用 public class BasicTransmit { public static void test(boolean test){ test =! test; System.out.println("in test : test = "+test); } public static void main(String[] args) { b

java定义类 对象,引用,指针

java是根据面向对象编程,因此有类和对象的概念,类分为普通类与抽象类. 一.定义类 类由N个 构造器  成员变量  方法组成,可以不定义,也可以根据语法定义N个. [修饰符] class 类名{ 构造器*N个 成员变量*N个 方法*N个 } 1.类的修饰符只能是public final abstract 三种之一,或者不修饰 ,类名一般大写开头,驼峰命名 (一).成员变量的定义 [修饰符] 数据类型  变量名 : [修饰符] 数据类型  变量名  = 默认值: 1.修饰符:  可以不写(默认)

查看数据库对象的引用关系,查看数据库对象的依赖关系

转自:https://www.cnblogs.com/seusoftware/p/4858115.html 在SQL Server中,(可编程)对象间的引用即依赖关系,有多种方式可以检查,随着版本变更,方式也有所不同. 父子关系的对象,不通过依赖关系来查询,比如: 1. 外键关系 use tempdb GO --drop table tb1,tb2 create table tb1 ( col1 int Primary key, col2 int ) insert into tb1 values

Java中对象的引用关系

class Book { String name; double price; public void getInfo() { System.out.println("书名:" + name + " 价格是:" + price + "元"); } } public class Demo { public static void main(String args[]) { //创建两个不同的Book对象 Book bk1 = new Book();

JAVA中Integer对象的引用

JAVA中没有指针一说,但也有引用的概念.这里要说的主要是Integer是不是同一个对象. 1.先看一段代码: public static void main(String[] args){ Integer a1 = 100; Integer b1 = a1;//另一种也可以b1=100 Field field = null; try { field = a1.getClass().getDeclaredField("value"); } catch (NoSuchFieldExcep

01 对象的引用关系 VS 缓存

1.首先我们要知道jvm 对于对象的管理分为四种 强引用 软引用 弱引用 虚引用 偷来的图片 : 2. 既然在两次 gc 之间 弱引用可以进行存活,那么我们就可以实现缓存 代码 java 令人头疼的设计模式 package com.jvm.chop03.cache; ? ? import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.util.Collections; import ja