序列化基础:
Java 序列化是通过 java.io.Serializable 接口来实现的。如果一个类希望被序列化,需要实现 Serializable 接口。该接口是一个标记接口,不包含任何方法,只是表明该类可以被序列化。
import java.io.Serializable;
public class MyClass implements Serializable {
// 类的成员和方法
}
对象序列化:
使用 ObjectOutputStream 类可以将对象序列化为字节流,以便存储到文件或发送到网络。
import java.io.*;
public class SerializationExample {
public static void main(String[] args) {
// 创建一个对象
MyClass myObject = new MyClass();
// 序列化对象到文件
try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("object.ser"))) {
outputStream.writeObject(myObject);
System.out.println("Object serialized successfully.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
对象反序列化:
使用 ObjectInputStream 类可以从字节流中反序列化对象。
import java.io.*;
public class DeserializationExample {
public static void main(String[] args) {
// 反序列化对象
try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("object.ser"))) {
MyClass myObject = (MyClass) inputStream.readObject();
System.out.println("Object deserialized successfully.");
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
序列化版本号:
在序列化时,每个类都有一个版本号。如果在序列化之后对类进行了修改,Java 将使用版本号来验证是否可以正确反序列化。可以通过显式声明一个 serialVersionUID 字段来控制版本号,避免默认计算。
private static final long serialVersionUID = 1L;
避免序列化某些字段:
可以使用 transient 关键字标记某个字段,从而在序列化过程中排除该字段。
private transient String sensitiveInformation;
自定义序列化:
可以在类中定义 writeObject 和 readObject 方法来自定义序列化和反序列化的过程。
private void writeObject(ObjectOutputStream out) throws IOException {
// 自定义写操作
out.defaultWriteObject();
out.writeObject(sensitiveInformation.toUpperCase());
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
// 自定义读操作
in.defaultReadObject();
sensitiveInformation = ((String) in.readObject()).toLowerCase();
}
以上是 Java 序列化的基本概念和用法。需要注意的是,序列化和反序列化过程中类的结构需要保持一致。如果类发生了变化,可能导致反序列化失败。因此,在对类进行修改时,要注意版本号的管理和处理。
转载请注明出处:http://www.zyzy.cn/article/detail/435/Java