Java对象序列化与反序列化详解

5星 · 超过95%的资源 需积分: 16 1 下载量 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,可以帮助开发者更有效地处理对象的存储和传输。"