Java对象序列化与反序列化详解
5星 · 超过95%的资源 需积分: 16 113 浏览量
更新于2024-09-09
收藏 83KB DOC 举报
"Java对象的序列化和反序列化是将对象转换为字节序列以及将字节序列恢复为对象的过程。序列化主要用于持久化对象到硬盘或在网络中传输对象。在Java中,只有实现了Serializable或Externalizable接口的类的对象才能被序列化。ObjectOutputStream用于对象的序列化,而ObjectInputStream用于对象的反序列化。实现这两个接口的类有不同的序列化行为控制。下面将详细阐述这些概念和相关的API使用方法。
一、序列化和反序列化的概念
序列化是将Java对象转换为字节序列,便于存储或在网络中传输。这主要应用于两个场景:一是将对象持久化到磁盘,例如Web服务器处理大量Session对象时,可能会选择序列化部分Session以节省内存;二是在网络通信中,对象需要转化为二进制数据进行传输。
二、JDK序列化API
1. `java.io.ObjectOutputStream`:这个类提供了将对象序列化到输出流的方法,如`writeObject(Object obj)`,它会将对象转换为字节序列并写入到指定的输出流。
2. `java.io.ObjectInputStream`:此类负责从输入流中读取字节序列并反序列化为对象,通过调用`readObject()`方法可以实现这一过程。
三、序列化接口
- `Serializable`:这是Java提供的标准序列化接口,任何实现此接口的类都可以被序列化。如果一个类没有显式实现此接口,其子类仍然可以被序列化,因为Java支持继承的序列化。
- `Externalizable`:这个接口继承自Serializable,但提供了更细粒度的序列化控制。实现这个接口的类需要自己定义序列化和反序列化的行为,而不是依赖默认的序列化机制。
四、序列化和反序列化步骤
- 序列化:创建一个`ObjectOutputStream`实例,通常会包装一个文件输出流或其他输出流;然后调用`writeObject(Object obj)`方法来序列化对象。
- 反序列化:创建一个`ObjectInputStream`实例,通常包装一个文件输入流或其他输入流;接着调用`readObject()`方法来读取和反序列化对象。
五、示例
以下是一个简单的序列化示例,展示了如何定义一个实现了Serializable接口的Person类,并进行序列化和反序列化操作:
```java
import java.io.*;
class Person implements Serializable {
String name;
int age;
// 构造函数、getter和setter省略
}
public class SerializationDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 创建Person对象
Person person = new Person();
person.name = "John Doe";
person.age = 30;
// 序列化
FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(person);
out.close();
fileOut.close();
// 反序列化
FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
Person deserializedPerson = (Person) in.readObject();
in.close();
fileIn.close();
System.out.println("Deserialized person:");
System.out.println("Name: " + deserializedPerson.name);
System.out.println("Age: " + deserializedPerson.age);
}
}
```
在这个示例中,我们创建了一个Person对象,序列化到一个名为"person.ser"的文件,然后从该文件中反序列化回Person对象,从而验证了序列化和反序列化的完整过程。
总结:序列化和反序列化是Java中重要的数据处理技术,对于数据持久化和网络通信有着关键作用。理解并熟练掌握这些概念和API,可以帮助开发者更有效地处理对象的存储和传输。"
2011-04-22 上传
2016-04-27 上传
2013-12-03 上传
152 浏览量
2022-08-08 上传
2013-05-04 上传
2019-05-01 上传
2011-10-10 上传
「已注销」
- 粉丝: 8
- 资源: 5
最新资源
- StarModAPI: StarMade 模组开发的Java API工具包
- PHP疫情上报管理系统开发与数据库实现详解
- 中秋节特献:明月祝福Flash动画素材
- Java GUI界面RPi-kee_Pilot:RPi-kee专用控制工具
- 电脑端APK信息提取工具APK Messenger功能介绍
- 探索矩阵连乘算法在C++中的应用
- Airflow教程:入门到工作流程创建
- MIP在Matlab中实现黑白图像处理的开源解决方案
- 图像切割感知分组框架:Matlab中的PG-framework实现
- 计算机科学中的经典算法与应用场景解析
- MiniZinc 编译器:高效解决离散优化问题
- MATLAB工具用于测量静态接触角的开源代码解析
- Python网络服务器项目合作指南
- 使用Matlab实现基础水族馆鱼类跟踪的代码解析
- vagga:基于Rust的用户空间容器化开发工具
- PPAP: 多语言支持的PHP邮政地址解析器项目