序列化起初看样子,我以为紧紧是记录和还原对象的值而已,如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的对象时,获取与这个序列号相关联的对象引用。
所以,综上所述,对象就被完整的还原了~
分享到:
相关推荐
**二、JSON反序列化** 反序列化是将JSON字符串恢复为C++对象的过程。继续以nlohmann/json为例: 1. 从JSON字符串创建json对象: ```cpp std::string jsonString = R"({"name":"John","age":30})"; json j = json::...
在C#中,我们可以使用.NET框架提供的`System.Runtime.Serialization.Formatters.Binary.BinaryFormatter`类来进行二进制序列化,或者使用`System.Xml.Serialization.XmlSerializer`来进行XML序列化。而在Java中,...
2. **序列化的作用**: - 持久化数据:将对象状态保存到硬盘,便于下次读取。 - 网络传输:在网络间传输对象,例如RMI(远程方法调用)。 - 缓存和备份:在内存不足时,将对象写入磁盘,需要时再加载。 3. **...
2. **二进制序列化**:使用`archive::binary_oarchive`,可以生成更小的文件,适合于需要高效存储和传输的情况。二进制格式不是人类可读的,但是可以节省大量存储空间和提高传输效率。 在 Boost.Serialization 中,...
本文将深入探讨Hessian框架的基础知识,它是一个高效的二进制序列化协议,广泛应用于Java和.NET之间跨语言通信。通过学习Hessian,我们可以更有效地处理数据传输,提高应用性能。 首先,让我们理解什么是序列化。...
本资源聚焦于C#中的二进制序列化,这是一种效率高、数据紧凑的序列化方式。下面将详细阐述二进制序列化的概念、使用方法以及它在实际开发中的应用。 二进制序列化是.NET框架提供的一种机制,它可以将对象转换为原始...
XML序列化与反序列化是.NET框架中处理数据交换的重要技术,它允许我们将对象的状态转换为XML格式的数据,也可以将XML数据恢复为等效的对象。这个实战项目专注于使用C#实现这一过程,使得开发者能够方便地在XML文件和...
序列化是将一个对象的状态转换为可以存储或传输的形式,通常是XML、JSON或二进制格式。这样做的好处在于,我们可以保存对象的状态并在稍后恢复,或者将对象发送到远程服务器。在C#中,我们可以使用ISerializable接口...
在.NET框架中,有两种常见的序列化方式:二进制序列化和XML序列化。这两种方法各有优缺点,适用于不同的场景。 一、二进制序列化 二进制序列化是.NET框架提供的一种高效的数据序列化方式,它将对象转换为字节流,以...
序列化DLL文件通常涉及将内存中的函数、变量和类结构转换为二进制流或XML等文本格式,以便在磁盘上保存或通过网络发送。反序列化则是将这个流恢复为原来的函数和数据结构,使其能够在应用程序中正常工作。 接下来,...
Cereal支持将对象序列化为JSON、XML和二进制格式,并提供了灵活的API来自定义序列化和反序列化过程。它可以序列化基本数据类型、STL容器、自定义类和结构体等。不需要安装,只需把hpp文件包含在项目即可。
#### 二、序列化的应用场景 序列化在多种场景下都非常有用: 1. **对象持久化**:当你希望将内存中的对象状态保存到文件或数据库中时,序列化是一种非常有效的方式。例如,在游戏开发中,可以通过序列化保存玩家的...
在IT领域,序列化和反序列化是两个关键的概念,特别是在处理对象持久化、网络传输或数据存储时。本文将详细探讨标题所提及的“hashtable序列化与反序列化”,并提供一个基本的示例。 首先,让我们理解什么是序列化...
在IT行业中,序列化和反序列化是两个关键的概念,特别是在对象持久化、数据传输以及存储方面。在Delphi编程环境中,这两个概念同样至关重要。本文将深入探讨Delphi中的序列化与反序列化,以及如何处理组件和结构体的...
2. **JSON序列化与反序列化**: - **JSON序列化**:随着Web服务和API的普及,JSON(JavaScript Object Notation)成为了另一种常见的数据交换格式。在C#中,可以使用 `Newtonsoft.Json` 库(通常称为Json.NET)的 `...
2. **XmlSerializer**: 生成符合XML标准的序列化结果,数据可读性强,跨平台,但序列化速度相对较慢。 3. **DataContractSerializer**: 更加灵活,用于WCF服务,可以序列化匿名类型,但不支持非公共属性和字段。 4. ...
相比于XML或JSON等文本格式,protobuf的序列化结果更小,解析速度更快,因为它是二进制编码。此外,protobuf提供了强大的类型定义,支持复杂的数据结构,包括消息嵌套、数组和枚举类型,使得数据结构更加清晰和易于...
方法二:反序列化取节点标签值 当XML节点包含实际的值而不是键值对时,我们需要获取这些节点的标签值。这可以通过在C#类中定义对应的属性,并使用`XmlElement`特性来指定其对应的XML元素。`XmlSerializer`会自动将...
2. commons-lang3-3.3.2.jar:Apache Commons Lang库提供了许多实用的Java语言功能,包括序列化和反序列化的辅助工具,如`SerializationUtils`类,可用于简化对象的序列化和反序列化操作。 3. commons-beanutils-...
Java反序列化是一种将已序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方式。在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入...