对象序列化与反序列化(ObjectInputStream_ObjectOutputStream)详解
发布时间: 2024-01-07 22:57:44 阅读量: 43 订阅数: 22
对象的序列化与反序列化
# 1. 对象序列化与反序列化的基础概念
### 1.1 什么是对象序列化与反序列化
对象序列化是指将对象转换为字节流的过程,以便在网络传输或永久保存到磁盘上。而对象反序列化则是将字节流转换回对象的过程。在Java中,通过实现Serializable接口,可以使一个对象具备序列化和反序列化的能力。
### 1.2 为什么需要对象序列化与反序列化
对象序列化与反序列化的主要目的是实现对象的持久化存储和跨网络传输。
持久化存储:将对象保存到磁盘文件中,使得对象可以在程序关闭后仍然存在,并在下次启动时可以重新加载,保持数据的持久性。
网络传输:通过网络传输对象,可以在分布式系统中实现进程间的通信和数据共享,并且能够保持对象的完整性和一致性。
### 1.3 序列化与反序列化的基本原理
序列化的基本原理是将对象转换为字节流,通过将对象的状态信息进行编码,包括对象的属性值、类型信息等内容,并将编码后的字节流传输或保存到存储设备中。
反序列化的基本原理是将字节流解码为对象的状态信息,并使用该信息重新创建对象。
Java的对象序列化与反序列化主要依靠ObjectOutputStream和ObjectInputStream两个类来实现。通过这两个类提供的方法,可以将对象写入输出流并保存至文件或通过网络发送,然后再从输入流中读取字节流并将其反序列化为对象。
# 2. Java中的对象序列化与反序列化
### 2.1 Java中对象序列化的实现方式
在Java中,对象序列化是通过实现Serializable接口来完成的。示例代码如下:
```java
import java.io.*;
// 定义一个可序列化的类
class Person implements Serializable {
String name;
int age;
// 省略其他属性和方法
}
public class SerializationExample {
public static void main(String[] args) {
try {
// 创建一个序列化对象输出流
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.ser"));
// 创建一个Person对象
Person person = new Person();
person.name = "Alice";
person.age = 25;
// 将对象序列化到文件中
out.writeObject(person);
// 关闭流
out.close();
System.out.println("Person object has been serialized.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
#### 代码说明:
- 创建一个实现了Serializable接口的Person类。
- 在SerializationExample类中,创建一个ObjectOutputStream对象来实现对象序列化。
- 创建Person对象并设置其属性。
- 使用writeObject方法将Person对象序列化到文件中。
### 2.2 Java中对象反序列化的实现方式
Java中的对象反序列化可以通过ObjectInputStream来实现。示例代码如下:
```java
import java.io.*;
public class DeserializationExample {
public static void main(String[] args) {
try {
// 创建一个序列化对象输入流
ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.ser"));
// 从文件中反序列化对象
Person person = (Person) in.readObject();
// 关闭流
in.close();
// 输出反序列化后的对象属性
System.out.println("Deserialized Person - Name: " + person.name + ", Age: " + person.age);
System.out.println("Person object has been deserialized.");
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
```
#### 代码说明:
- 在DeserializationExample类中,创建一个ObjectInputStream对象来实现对象反序列化。
- 使用readObject方法从文件中反序列化出一个Person对象。
- 输出反序列化后的Person对象的属性。
### 2.3 序列化版本号的重要性
在Java对象序列化与反序列化中,版本号的重要性不容忽
0
0