Java对象序列化与持久化详解

需积分: 3 1 下载量 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开发者来说是非常重要的。
2021-09-15 上传