JDK(Java Development Kit)提供了一种内置的序列化机制,即 Java 对象序列化。它允许将 Java 对象转换为字节流,以便在网络上传输或保存到磁盘上,并且可以通过反序列化将字节流重新转换回 Java 对象。
JDK 自带的序列化方式具有以下几个优点:
JDK 自带的序列化方式基于 Java 的反射机制和字节码技术来实现。当一个对象被序列化时,JVM 会根据对象的类型和结构将其转换为字节流。在反序列化时,JVM 会根据字节流中的信息重新构造出原始对象。
具体实现过程如下:
ObjectOutputStream
的writeObject()
方法时,JVM 会检查被序列化的对象是否实现了 Serializable 接口。如果没有实现,则抛出NotSerializableException
异常。如果实现了 Serializable 接口,则 JVM 会通过反射机制获取对象的类结构,并将其转换为字节流。ObjectInputStream
的readObject()
方法时,JVM 会读取字节流并还原成 Java 对象。在此过程中,JVM 会使用反射机制创建对象,并通过反射设置对象的属性值。以下是一个简单的示例代码,演示了如何使用 JDK 自带的序列化方式:
import java.io.*;
public class SerializationExample {
public static void main(String[] args) {
// 创建一个Person对象
Person person = new Person("John", 25);
try {
// 将Person对象序列化到文件中
FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(person);
out.close();
fileOut.close();
// 从文件中反序列化Person对象
FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
Person deserializedPerson = (Person) in.readObject();
in.close();
fileIn.close();
// 打印反序列化后的Person对象
System.out.println("Deserialized Person:");
System.out.println("Name: " + deserializedPerson.getName());
System.out.println("Age: " + deserializedPerson.getAge());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
transient
关键字将其标记为瞬态字段,这样在序列化过程中会被忽略。readObject()
和writeObject()
方法等方式来实现版本兼容性。JDK 自带的序列化方式提供了一种简单易用的 Java 对象序列化和反序列化机制。它具有跨平台、对象图形完整性和版本兼容性等优点,但也存在序列化后的字节流较大、可读性差和性能较低等缺点。在使用时需要注意序列化 ID 的一致性、非序列化字段的处理和版本兼容性等问题。