参考答案:
Java 序列化(Serialization)是将 Java 对象转换为字节流的过程,这样对象就可以被存储到文件、数据库或通过网络传输。反过来,反序列化(Deserialization)则是将字节流重新转换为对象的过程。
Java 序列化的核心目标是将内存中的对象状态保存到持久存储中,或通过网络进行传输,并且可以在之后恢复(反序列化)为原始对象,以便进行后续的操作。
Java 中的对象通常存储在内存中,但很多时候我们需要将这些对象保存到磁盘、数据库或通过网络发送到远程机器。这就需要将对象转换为字节流进行存储或传输。反序列化是将字节流重新构造成对象的过程,从而能够在不同的环境中使用。
要使一个 Java 对象能够序列化,必须让该对象的类实现 java.io.Serializable
接口。Serializable
是一个标记接口,即它没有任何方法,只是表明该类的对象可以被序列化。
Serializable
接口1import java.io.Serializable; 2 3public class Person implements Serializable { 4 private String name; 5 private int age; 6 7 // 构造方法、getter 和 setter 8 public Person(String name, int age) { 9 this.name = name; 10 this.age = age; 11 } 12}
使用 ObjectOutputStream
将对象写入输出流,存储为字节流。
1import java.io.*; 2 3public class SerializationExample { 4 public static void main(String[] args) { 5 Person person = new Person("John", 30); 6 7 try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) { 8 oos.writeObject(person); // 将对象序列化为字节流 9 System.out.println("对象已成功序列化!"); 10 } catch (IOException e) { 11 e.printStackTrace(); 12 } 13 } 14}
使用 ObjectInputStream
将字节流还原为 Java 对象。
1import java.io.*; 2 3public class DeserializationExample { 4 public static void main(String[] args) { 5 try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) { 6 Person person = (Person) ois.readObject(); // 将字节流反序列化为对象 7 System.out.println("反序列化对象: " + person.getName() + ", " + person.getAge()); 8 } catch (IOException | ClassNotFoundException e) { 9 e.printStackTrace(); 10 } 11 } 12}
serialVersionUID
serialVersionUID
是一个版本标识符,它用来确保序列化和反序列化时版本的兼容性。每次类的结构发生变化(如添加或删除字段)时,都应修改 serialVersionUID
。serialVersionUID
检查并抛出 InvalidClassException
异常。1private static final long serialVersionUID = 1L;
transient
关键字
transient
用于修饰不希望被序列化的字段。被 transient
修饰的字段不会被序列化。1private transient String password; // 该字段不会被序列化
writeObject()
和 readObject()
writeObject()
和 readObject()
方法来进行定制。1private void writeObject(ObjectOutputStream out) throws IOException { 2 out.defaultWriteObject(); // 默认序列化 3 // 可以添加自定义的序列化逻辑 4} 5 6private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { 7 in.defaultReadObject(); // 默认反序列化 8 // 可以添加自定义的反序列化逻辑 9}
静态字段:
构造方法:
子类的序列化:
Serializable
接口才能保证整个对象可以被序列化。如果父类不可序列化,则反序列化时会抛出 java.io.NotSerializableException
异常。最近更新时间:2024-12-24