10. Java 中的序列化和反序列化是什么?
大约 2 分钟
序列化(Serialization)
序列化是将Java对象的状态转换为字节流的过程。这个字节流可以被保存到文件中,传输到远程系统,或者通过网络发送。通过序列化,可以将内存中的对象持久化保存起来,以便在后续使用时重新恢复成对象。
序列化的常见用途:
- 将对象存储到文件中,以便以后可以恢复。
- 在分布式系统中通过网络传输对象。
- 将对象存储在数据库中。
- 在Java RMI(远程方法调用)中,将对象从一个JVM传递到另一个JVM。
反序列化(Deserialization)
反序列化是将字节流恢复为Java对象的过程。通过反序列化,可以从文件、数据库、网络等源中读取字节流,并重建成内存中的对象。反序列化用于从持久化存储或远程系统中恢复对象状态。
Java 中如何实现序列化和反序列化
Java提供了内置的API来实现序列化和反序列化,主要通过java.io.Serializable
接口来标记一个类是可以序列化的。
步骤:
实现Serializable接口:
- 要使一个类的对象可以序列化,该类需要实现
Serializable
接口。这个接口没有任何方法,仅仅是一个标记接口。
import java.io.Serializable; public class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } // Getters and setters... }
- 要使一个类的对象可以序列化,该类需要实现
使用ObjectOutputStream进行序列化:
- 使用
ObjectOutputStream
类将对象写入字节流,通常与FileOutputStream
结合使用,将对象序列化到文件中。
Person person = new Person("Alice", 30); FileOutputStream fileOut = new FileOutputStream("person.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(person); out.close(); fileOut.close();
- 使用
使用ObjectInputStream进行反序列化:
- 使用
ObjectInputStream
类读取字节流并恢复对象,通常与FileInputStream
结合使用,从文件中反序列化对象。
FileInputStream fileIn = new FileInputStream("person.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); Person person = (Person) in.readObject(); in.close(); fileIn.close();
- 使用
注意事项
- serialVersionUID:每个可序列化的类建议定义一个
serialVersionUID
,用于验证在反序列化时类的版本一致性。如果类在序列化后发生变化,反序列化时可能会导致InvalidClassException
。 - transient 关键字:如果类中的某些字段不需要被序列化,可以用
transient
关键字修饰,序列化过程会忽略这些字段。 - NotSerializableException:如果试图序列化未实现
Serializable
接口的类的对象,将抛出该异常。
序列化和反序列化是Java中进行对象持久化和网络传输的重要机制,通过这两种机制,可以在不同环境下保存和恢复对象状态。