1. 什么是序列化和反序列化?
序列化是指将内存中的对象转化为可存储或传输的格式(例如,JSON、XML、二进制等)。简言之,就是把复杂的对象转换成字节流或者字符串。
反序列化则是将这些存储或传输的格式转换回内存中的对象,也就是把字节流或者字符串恢复成原来的对象。
2. 为什么需要序列化和反序列化?
我们常常需要将数据从内存中保存到磁盘、数据库中,或者在不同的计算机之间传输。序列化可以让复杂的对象转换成易于存储和传输的格式,而反序列化则可以把这些存储或传输过的数据恢复成原来的对象。
3. 通俗例子
假设你有一个“人”对象,包含姓名、年龄和地址。
序列化:
就像你把一个“人”装进一个箱子(对象),然后把箱子寄给别人。这时,箱子内部的“人”被转化成了某种格式(如 JSON 字符串),你可以通过网络传输或者存储这个箱子。
反序列化:
别人收到这个箱子(字符串),然后打开箱子,把里面的“人”恢复成原来的样子。这就是反序列化过程。
4. 序列化和反序列化的示例代码
我们以 Java 语言为例,使用常见的 JSON 格式进行序列化和反序列化。
依赖(使用 Jackson 库来处理 JSON)
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version>
</dependency>
定义一个“人”的类
import com.fasterxml.jackson.databind.ObjectMapper;public class Person {private String name;private int age;private String address;// 构造方法、getter、setter略@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + ", address='" + address + "'}";}public static void main(String[] args) throws Exception {// 创建一个 Person 对象Person person = new Person("Alice", 30, "123 Wonderland");// 序列化:将 Person 对象转换成 JSON 字符串ObjectMapper objectMapper = new ObjectMapper();String jsonString = objectMapper.writeValueAsString(person);System.out.println("序列化后的 JSON 字符串: " + jsonString);// 反序列化:将 JSON 字符串转换回 Person 对象Person deserializedPerson = objectMapper.readValue(jsonString, Person.class);System.out.println("反序列化后的 Person 对象: " + deserializedPerson);}
}
代码解析:
-
序列化:
objectMapper.writeValueAsString(person)
将Person
对象转换成 JSON 字符串。
-
反序列化:
objectMapper.readValue(jsonString, Person.class)
将 JSON 字符串转换回Person
对象。
输出:
序列化后的 JSON 字符串: {"name":"Alice","age":30,"address":"123 Wonderland"}
反序列化后的 Person 对象: Person{name='Alice', age=30, address='123 Wonderland'}
5. 使用场景
- 存储数据: 可以将对象序列化后保存到文件中,或者数据库里,然后需要时再反序列化出来使用。
- 网络通信: 客户端和服务器之间通常会使用序列化/反序列化来传输对象。
- 跨语言数据交换: 比如 JSON、XML 是跨语言的标准格式,可以通过序列化将 Java 对象转成 JSON,反序列化时可以在 Python 或其他语言中处理。
6. 总结
- 序列化是将对象转换成可以存储或传输的格式(如 JSON 字符串、二进制等)。
- 反序列化是将这种格式恢复为原来的对象。
- 通过这种方式,我们可以方便地进行数据存储、网络传输以及不同平台间的数据交换。