Java对象序列化与反序列化详解

需积分: 34 1 下载量 42 浏览量 更新于2024-07-13 收藏 1.21MB PPT 举报
"Java对象序列化与反序列化是将Java对象转化为二进制字节流,以便存储或在网络中传输。此过程涉及到Serializable和Externalizable接口,以及ObjectOutputStream和ObjectInputStream类。" 在Java中,对象的序列化是通过实现`Serializable`接口来实现的。这个接口是一个标记接口,没有包含任何方法,它的作用是告诉Java虚拟机(JVM)该类的对象可以被序列化。同时,`Externalizable`接口继承自`Serializable`,但提供了更多的自定义控制权,需要程序员手动指定序列化和反序列化的行为。 `ObjectOutputStream`和`ObjectInputStream`是处理对象序列化和反序列化的关键类。`ObjectOutputStream`用于将对象写入输出流,而`ObjectInputStream`则负责从输入流读取对象。它们的构造函数分别接受`InputStream`和`OutputStream`作为参数,允许我们使用任何类型的输入/输出流进行对象的序列化和反序列化。 序列化过程中,需要注意的是,只有实现了`Serializable`接口的类的对象才能被序列化。如果反序列化时找不到对应的类文件,会抛出`ClassNotFoundException`。此外,反序列化时不调用类的构造方法,而是直接复原对象的状态。 在处理具有关联关系的对象时,如`Teacher`类中包含`Set<Student>`,当序列化`Teacher`对象时,系统会递归地序列化与其关联的所有可序列化的`Student`对象。这意味着,如果一个对象包含其他可序列化的对象,这些对象也会一起被序列化。 对象序列化的主要应用场景包括: 1. 将对象持久化到硬盘,通常存储为`.obj`或`.ser`文件。 2. 在网络通信中传输对象,例如在分布式系统中。 自定义序列化有两种方式:一是重写`writeObject()`和`readObject()`方法,这种方式允许对序列化的行为进行精细控制;二是实现`Externalizable`接口,直接控制序列化和反序列化的具体过程。 在进行序列化时,应确保序列化和反序列化的顺序一致,避免因序列化文件的改变导致反序列化失败。同时,为了清晰标识序列化文件,建议使用`.obj`或`.ser`作为文件扩展名,而不是`.txt`。 Java对象的序列化和反序列化是对象持久化和跨网络通信的重要手段,通过实现特定接口和使用特定的输入/输出流类,我们可以方便地将复杂的数据结构转换为字节流,并在需要时恢复为原始对象。