序列化起初看样子,我以为紧紧是记录和还原对象的值而已,如A.x=10,B.y=20。
不过,其实很多情况确实没有想过,例如下面的例子:
Employee harry = new Employee("Harry Hacker", 50000, 1989, 10, 1);
Manager carl = new Manager("Carl Cracker", 80000, 1987, 10, 1);
carl.setSecretary(harry);
Manager tony = new Manager("Tony Tester", 40000, 1990, 10, 1);
tony.setSecretary(harry);
Employee staff = new Employee[3];
staff[0] = carl;
staff[1] = harry;
staff[2] = tony;
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("employee.dat"));
out.writeObject(staff);
out.close();
看得到,第一个对象被存入了后两个的对象中,以前从没想过是否能读出来过,那么看看下面的代码:
ObjectInputStream in = xxx;
Employee[] newStaff = (Employee[])in.readObject();
in.close();
newStaff[1].raiseSalary(10);
for(Employee e = newStaff) {
System.out.println(e);
}
我们根据打印,可以看到,对象真的被完美还原了,很酷吧。
为什么会这样呢?原因是,我们这种机制,每个对象都是用一个
序列号(serial number)保存的,这就是这种机制之所以称为
对象序列化的原因。
简单介绍一下算法:
- 每遇到一个对象引用都关联一个序列号
- 对于每个对象,当第一次遇见,保存其对象数据到流中。
- 如果某个对象之前保存过,那么只记录“与之前保存过的序列号为x的对象相同”
在读回对象时,整个过程相反:
- 对于流中的对象,在第一次遇到其序列号时,构建它,并使用流中数据来初始化它,然后记录这个序列号和新对象的关联。
- 当下次遇到序列号同时为x的对象时,获取与这个序列号相关联的对象引用。
所以,综上所述,对象就被完整的还原了~
分享到:
相关推荐
二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。 SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以...
二进制序列化和XML序列化
此资源是《C#序列化和反序列化之一-二进制序列化》的源代码,博文地址是:http://blog.csdn.net/jiangzhanchang/article/details/6892262
C# xml序列化及反序列化(解析xml为对象及对象转xml保存),方法一反序列化取节点KV值,方法二反序列化取节点标签值,方法三取节点KV值,并增加节点对象数组及节点标签组合反序列化
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core <version>1.0.1 ...
.NET框架提供了两种种串行化的方式:1、是使用BinaryFormatter进行串行化;2、使用XmlSerializer进行串行化。...如果某个类的元素不想被序列化,1、可以使用[NonSerialized]属性来标志,2、可以使用[XmlIgnore]来标志。
Unity 中使用Protobuf进行序列化和反序列化的Demo
.net 序列化与反序列化示例 使用.net 自带的xml序列化,二进制序列化,演示
1、包含文件和二进制两种序列化的方式 2、支持类的序列化和STL容器的序列化 3、支持序列化的流自定义(示例中使用的是std::stringstream,也可以使用其他的流)
本Dll提供了二进制序列化和Xml序列化,序列化之后,可以对序列化数据,进行压缩。本dll提供了两种压缩方式,GZipStream和DeflateStream,在使用Webservice作为服务端的系统中,提高传输性能是比较关键的,而提高传输...
C#中二进制数组h和各种常规数组的转换,二进制序列化和json序列化方法以及对应的反序列化方法的例子,帮助初学者。
了解序列化与反序列化,使用 印象笔记 打开,谢谢!
ssh2 试用ajax序列化及反序列化案例
C#序列化(二)二进制序列化的案例 c#经典案例.pdf
自定义了二维图形库,该图形库实现了二维图形的绘制,编辑以及和用户的交互。更重要的是实现了图形的序列化和反序列化,使的图形的保存,显示,编辑
10万次序列化,1万次反序列化,毫秒。 阿里序列化时间 1122 1054 1115 阿里反序列化时间 409 423 412 HZS序列化时间 884 864 880 HZS反序列化时间 392 375 394 JAVA7版已经逼近阿里的速度,JAVA8版利用了闭包技术...
XML序列化与反序列化整理文档(12套) (附xml转化为序列化代码工具XML 2 Class) (附XML序列化的实例原代码)
C#自定义可序列化的Dictionary类型
序列化 (serialization):将对象的状态信息转换为可以存储或传输的形式的过程。 与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。 序列化的目的 1、以某种存储形式使...
海尔2307户户通直播星序列化工具为工厂维修机器使用使用场景:(1)更换flash需要重新进行序列化, 更改stbid或保留stbid不变1.本工具不需要连接工厂数据库,而是直接从HIC2307_NDSCA_xxxxxxxx_xxxxxxxx.dat文件里...