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

需积分: 14 5 下载量 66 浏览量 更新于2024-08-18 收藏 97KB PPT 举报
"对象序列化(串行化)是指将对象的状态转换为可存储或可传输的形式的过程。这种技术使得程序能够保存对象的状态,并在需要时恢复这些对象,赋予对象持久性。对象串行化主要关注的是实例变量的数值,而非瞬态变量,因为瞬态变量的值不会被包含在序列化状态中。Java平台中的许多系统类已经实现了序列化接口,可以直接进行文件保存。 在Java中,实现对象序列化的方式是让类实现`Serializable`接口,这是一个标记接口,不包含任何方法。这意味着,当你创建一个类并让它实现`Serializable`接口,Java运行时系统就能够知道这个类的对象可以被序列化。此外,还有一种更灵活的方式,即实现`Externalizable`接口,这个接口要求实现两个方法:`writeExternal()`和`readExternal()`,允许自定义序列化和反序列化的行为。 以下是一个简单的示例,展示了如何实现`Serializable`接口进行序列化: ```java package demo; import java.io.Serializable; public class Person implements Serializable { private String name; private char sex; private int age; public Person(String name, char sex, int age) { this.name = name; this.sex = sex; this.age = age; } public String getName() { return name; } // 其他getter和setter方法 } ``` 在这个例子中,`Person`类实现了`Serializable`接口,所以它的实例可以被序列化。序列化的过程通常是通过`ObjectOutputStream`类来完成,而反序列化则使用`ObjectInputStream`。例如: ```java import java.io.*; public class SerializationDemo { public static void main(String[] args) { try { Person person = new Person("张三", 'M', 30); // 序列化 FileOutputStream fileOut = new FileOutputStream("person.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(person); out.close(); fileOut.close(); System.out.println("Serialized data is saved in person.ser"); // 反序列化 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.getName()); System.out.println("Sex: " + deserializedPerson.getSex()); System.out.println("Age: " + deserializedPerson.getAge()); } catch (IOException i) { i.printStackTrace(); } catch (ClassNotFoundException c) { System.out.println("Person class not found"); c.printStackTrace(); } } } ``` 这个代码片段展示了如何将`Person`对象序列化到一个文件`person.ser`,然后从该文件中反序列化回`Person`对象。需要注意的是,如果在序列化后对类做了修改,如添加了新的字段,那么在反序列化时可能会遇到问题,因为旧的序列化数据可能无法正确地映射到新的类结构上。在这种情况下,可以使用`serialVersionUID`字段来帮助解决兼容性问题,避免出现`InvalidClassException`。 对象序列化是Java中一种重要的机制,它允许程序在各种场景下保存和恢复对象的状态,例如持久化存储、网络传输、进程间通信等。通过实现`Serializable`接口或`Externalizable`接口,开发者可以控制对象的序列化行为,确保数据的正确存储和恢复。"