Java对象序列化与持久化详解
需积分: 3 120 浏览量
更新于2024-09-19
收藏 44KB DOC 举报
"14.序列化.doc 是关于Java编程中的序列化技术的文档,讲述了如何将对象转换为字节流以便保存和恢复。文件标签同样指出了序列化这一主题。主要内容涉及到序列化的概念、特点以及相关的接口和类。"
在Java中,序列化是一种将对象的状态转换为字节流的过程,以便于存储或在网络中传输。这使得我们可以将对象保存到硬盘上实现持久化,或者在不同的网络节点之间传递对象。要使一个类的对象能够支持序列化,该类需要实现`java.io.Serializable`接口。`Serializable`接口是一个标记接口,不包含任何方法,仅作为标记使用,表明类的对象是可序列化的。
序列化有以下几个关键特点:
1. 只有对象的非静态成员变量会被保存,因为静态变量属于类而不是特定的实例,而成员方法不会被保存,因为它们不包含在对象的状态之中。
2. 如果一个对象的成员变量是另一个对象的引用,那么这个引用的对象的数据成员也会被递归地序列化。
3. 如果序列化的对象引用了一个不可序列化的对象,那么序列化操作会失败并抛出`NotSerializableException`异常。为了解决这个问题,可以将不可序列化的成员变量声明为`transient`,这样它将不会被序列化,对象的其他部分仍可以正常序列化。
在Java中,与序列化相关的有两个主要接口:`ObjectInput`和`ObjectOutput`。这些接口提供了读取和写入基本数据类型以及对象的方法。同时,`ObjectInputStream`和`ObjectOutputStream`是这两个接口的实现,它们分别用于从输入流中读取序列化的对象和向输出流中写入序列化的对象。
以下是一个简单的序列化示例:
```java
public class SerializableTest {
public static void main(String[] args) throws Exception {
People p1 = new People(20, "jack", 170);
People p2 = new People(28, "bob", 185);
People p3 = new People(26, "mark", 165);
FileOutputStream fos = new FileOutputStream("people.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p1);
oos.writeObject(p2);
oos.writeObject(p3);
oos.close();
FileInputStream fis = new FileInputStream("people.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
People deserializedP1 = (People) ois.readObject();
People deserializedP2 = (People) ois.readObject();
People deserializedP3 = (People) ois.readObject();
ois.close();
}
}
```
在这个例子中,`SerializableTest`类创建了三个`People`对象,并使用`ObjectOutputStream`将它们写入文件。之后,使用`ObjectInputStream`从文件中读取这些对象,实现了对象的反序列化,从而可以重新使用它们。
序列化是Java中一个非常实用的特性,它允许我们在各种场景下保存和恢复对象的状态,包括持久化存储、网络通信以及在不同进程间共享数据。理解并熟练运用序列化对于Java开发者来说是非常重要的。
2022-05-02 上传
2012-06-27 上传
2011-12-02 上传
2008-10-27 上传
2022-03-25 上传
2022-07-13 上传
2021-06-16 上传
zfc2201
- 粉丝: 13
- 资源: 462
最新资源
- NIST REFPROP问题反馈与解决方案存储库
- 掌握LeetCode习题的系统开源答案
- ctop:实现汉字按首字母拼音分类排序的PHP工具
- 微信小程序课程学习——投资融资类产品说明
- Matlab犯罪模拟器开发:探索《当蛮力失败》犯罪惩罚模型
- Java网上招聘系统实战项目源码及部署教程
- OneSky APIPHP5库:PHP5.1及以上版本的API集成
- 实时监控MySQL导入进度的bash脚本技巧
- 使用MATLAB开发交流电压脉冲生成控制系统
- ESP32安全OTA更新:原生API与WebSocket加密传输
- Sonic-Sharp: 基于《刺猬索尼克》的开源C#游戏引擎
- Java文章发布系统源码及部署教程
- CQUPT Python课程代码资源完整分享
- 易语言实现获取目录尺寸的Scripting.FileSystemObject对象方法
- Excel宾果卡生成器:自定义和打印多张卡片
- 使用HALCON实现图像二维码自动读取与解码