`
nanapoleon
  • 浏览: 48022 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

序列化之二

    博客分类:
  • java
阅读更多
序列化起初看样子,我以为紧紧是记录和还原对象的值而已,如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的对象时,获取与这个序列号相关联的对象引用。


所以,综上所述,对象就被完整的还原了~
分享到:
评论

相关推荐

    C++ JSON 序列化与反序列化

    **二、JSON反序列化** 反序列化是将JSON字符串恢复为C++对象的过程。继续以nlohmann/json为例: 1. 从JSON字符串创建json对象: ```cpp std::string jsonString = R"({"name":"John","age":30})"; json j = json::...

    C#和Java的序列化反序列化

    在C#中,我们可以使用.NET框架提供的`System.Runtime.Serialization.Formatters.Binary.BinaryFormatter`类来进行二进制序列化,或者使用`System.Xml.Serialization.XmlSerializer`来进行XML序列化。而在Java中,...

    java 对象的序列化与反序列化

    2. **序列化的作用**: - 持久化数据:将对象状态保存到硬盘,便于下次读取。 - 网络传输:在网络间传输对象,例如RMI(远程方法调用)。 - 缓存和备份:在内存不足时,将对象写入磁盘,需要时再加载。 3. **...

    hessian学习基础篇——序列化和反序列化

    本文将深入探讨Hessian框架的基础知识,它是一个高效的二进制序列化协议,广泛应用于Java和.NET之间跨语言通信。通过学习Hessian,我们可以更有效地处理数据传输,提高应用性能。 首先,让我们理解什么是序列化。...

    《C#序列化和反序列化之一-二进制序列化》源代码

    本资源聚焦于C#中的二进制序列化,这是一种效率高、数据紧凑的序列化方式。下面将详细阐述二进制序列化的概念、使用方法以及它在实际开发中的应用。 二进制序列化是.NET框架提供的一种机制,它可以将对象转换为原始...

    XML序列化与反序列化 实战

    XML序列化与反序列化是.NET框架中处理数据交换的重要技术,它允许我们将对象的状态转换为XML格式的数据,也可以将XML数据恢复为等效的对象。这个实战项目专注于使用C#实现这一过程,使得开发者能够方便地在XML文件和...

    序列化和反序列化的封装类

    序列化是将一个对象的状态转换为可以存储或传输的形式,通常是XML、JSON或二进制格式。这样做的好处在于,我们可以保存对象的状态并在稍后恢复,或者将对象发送到远程服务器。在C#中,我们可以使用ISerializable接口...

    二进制序列化和XML序列化

    在.NET框架中,有两种常见的序列化方式:二进制序列化和XML序列化。这两种方法各有优缺点,适用于不同的场景。 一、二进制序列化 二进制序列化是.NET框架提供的一种高效的数据序列化方式,它将对象转换为字节流,以...

    序列化和反序列化dll文件和proto

    序列化DLL文件通常涉及将内存中的函数、变量和类结构转换为二进制流或XML等文本格式,以便在磁盘上保存或通过网络发送。反序列化则是将这个流恢复为原来的函数和数据结构,使其能够在应用程序中正常工作。 接下来,...

    java序列化(Serializable)的作用和反序列化.doc

    #### 二、序列化的应用场景 序列化在多种场景下都非常有用: 1. **对象持久化**:当你希望将内存中的对象状态保存到文件或数据库中时,序列化是一种非常有效的方式。例如,在游戏开发中,可以通过序列化保存玩家的...

    protobuf序列化和反序列化技术

    相比于XML或JSON等文本格式,protobuf的序列化结果更小,解析速度更快,因为它是二进制编码。此外,protobuf提供了强大的类型定义,支持复杂的数据结构,包括消息嵌套、数组和枚举类型,使得数据结构更加清晰和易于...

    hashtable序列化与反序列化

    在IT领域,序列化和反序列化是两个关键的概念,特别是在处理对象持久化、网络传输或数据存储时。本文将详细探讨标题所提及的“hashtable序列化与反序列化”,并提供一个基本的示例。 首先,让我们理解什么是序列化...

    delphi序列化与反序列化

    在IT行业中,序列化和反序列化是两个关键的概念,特别是在对象持久化、数据传输以及存储方面。在Delphi编程环境中,这两个概念同样至关重要。本文将深入探讨Delphi中的序列化与反序列化,以及如何处理组件和结构体的...

    四种反序列化与序列化

    2. **JSON序列化与反序列化**: - **JSON序列化**:随着Web服务和API的普及,JSON(JavaScript Object Notation)成为了另一种常见的数据交换格式。在C#中,可以使用 `Newtonsoft.Json` 库(通常称为Json.NET)的 `...

    序列化反序列化例题net

    2. **XmlSerializer**: 生成符合XML标准的序列化结果,数据可读性强,跨平台,但序列化速度相对较慢。 3. **DataContractSerializer**: 更加灵活,用于WCF服务,可以序列化匿名类型,但不支持非公共属性和字段。 4. ...

    C#序列化与反序列化(包括复杂xml对象)

    方法二:反序列化取节点标签值 当XML节点包含实际的值而不是键值对时,我们需要获取这些节点的标签值。这可以通过在C#类中定义对应的属性,并使用`XmlElement`特性来指定其对应的XML元素。`XmlSerializer`会自动将...

    Jedis序列化和反序列化使用jar

    2. commons-lang3-3.3.2.jar:Apache Commons Lang库提供了许多实用的Java语言功能,包括序列化和反序列化的辅助工具,如`SerializationUtils`类,可用于简化对象的序列化和反序列化操作。 3. commons-beanutils-...

    java反序列化工具

    Java反序列化是一种将已序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方式。在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入...

    json数据序列化和反序列化

    2. 数据序列化:序列化是将对象转换为可传输或存储的格式,对于JSON,这意味着将JavaScript对象转换为JSON字符串。在JavaScript中,我们可以使用`JSON.stringify()`方法实现这一过程。例如: ```javascript let obj ...

    java序列化和反序列化

    #### 二、实现序列化的步骤 要使一个Java对象支持序列化,需要遵循以下步骤: 1. **实现Serializable接口:** - Java类需要实现`java.io.Serializable`接口,这是一个标记接口,不包含任何方法。 - 实现此接口后...

Global site tag (gtag.js) - Google Analytics