江明涛的博客
Java 序列化和反序列化的基本概念和原理
Java 序列化和反序列化的基本概念和原理

Java 序列化和反序列化的基本概念和原理

Java 序列化和反序列化的基本概念和原理

Java 序列化和反序列化是 Java 语言中用于对象持久化和网络传输的重要概念。通过序列化,可以将对象的状态转换为字节流,从而能够在网络上传输或者存储到本地文件中;而反序列化则是将字节流重新转换回对象的过程。本文将探讨 Java 序列化和反序列化的基本概念和原理。

序列化

Java 对象的序列化是通过将对象的状态以字节流的形式进行存储,以便在需要的时候重新创建该对象。要实现序列化,需要使用 java.io.Serializable 接口。该接口并没有任何需要实现的方法,只是作为一个标记,表示该类的对象是可序列化的。

public class MyClass implements Serializable {
    private String name;
    private int age;
    // 构造方法和其他方法...
    // getters 和 setters...
}

在上面的示例中,MyClass 类实现了 Serializable 接口,表示该类的对象可以被序列化。如果一个类不实现 Serializable 接口,则无法进行序列化。

序列化的原理

当调用 ObjectOutputStreamwriteObject 方法将对象进行序列化时,以下过程会发生:

  1. 对象的类信息被写入字节流中;
  2. 对象的非静态和非瞬态字段的值被写入字节流中;
  3. 如果字段是一个对象的引用,则序列化该对象的引用,而不是整个对象;
  4. 如果字段是一个数组,则先写入数组的长度,然后逐个写入数组元素的值。

通过这种方式,对象的状态被转换为字节流,可以在网络上传输或者保存到文件中。

反序列化

反序列化是将字节流转换回对象的过程。要实现反序列化,只需要使用 java.io.ObjectInputStream 类的 readObject 方法即可。

public class DeserializeExample {
    public static void main(String[] args) {
        try {
            FileInputStream fileIn = new FileInputStream("object.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            MyClass obj = (MyClass) in.readObject();
            in.close();
            fileIn.close();
            System.out.println("对象已经被反序列化");
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

在上面的示例中,我们从名为 object.ser 的文件中读取字节流,并使用 ObjectInputStream 对象的 readObject 方法将其反序列化为一个 MyClass 对象。

通过序列化和反序列化,我们可以在分布式系统中轻松地传输对象的状态,或者将对象存储在磁盘上以供将来使用。这种机制为 Java 程序提供了持久存储的能力。