Java对象序列化与持久化详解
需积分: 14 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`接口,开发者可以控制对象的序列化行为,确保数据的正确存储和恢复。"
169 浏览量
2010-06-01 上传
424 浏览量
108 浏览量
2021-03-28 上传
2009-02-10 上传
2021-05-19 上传
187 浏览量