Java 序列化


Java 序列化

Java 序列化是指将 Java 对象转换成可存储或可传输的形式,以便在需要时重新创建相同的 Java 对象。通过序列化,Java 对象可以在网络上传输,或者在磁盘上存储。Java 序列化通常是使用 ObjectOutputStream 和 ObjectInputStream 类来实现的。本文将介绍一些基本的 Java 序列化知识。

实现序列化

要使 Java 对象能够序列化,必须实现 Serializable 接口。Serializable 接口是一个标记接口,表示该类可以被序列化。如果一个类需要被序列化,就必须实现该接口。示例代码如下:

public class Person implements Serializable {
    private String name;
    private int age;

    // 构造方法、getter 和 setter 方法省略

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

序列化对象

在序列化对象之前,需要创建 ObjectOutputStream 类的实例。将需要序列化的对象传递给 ObjectOutputStream 的 writeObject() 方法,即可将该对象序列化为一个字节数组。示例代码如下:

public static void main(String[] args) throws IOException {
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"));
    Person person = new Person("Alice", 30);
    oos.writeObject(person);
}

在执行上述代码后,将生成一个名为 person.ser 的文件,其中包含了 Person 对象的序列化数据。

反序列化对象

反序列化就是将存储在文件中或通过网络传输的序列化对象转换回成原始的 Java 对象。要进行反序列化,需要创建 ObjectInputStream 类的实例,然后调用 readObject() 方法。示例代码如下:

public static void main(String[] args) throws IOException, ClassNotFoundException {
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"));
    Person person = (Person) ois.readObject();
    System.out.println(person);
}

在执行上述代码后,将输出序列化前的 Person 对象的信息。

注意事项

在使用 Java 序列化时需要注意以下几点:

  1. 被序列化的对象的所有属性都必须是可序列化的,否则将会抛出 NotSerializableException 异常。
  2. 序列化和反序列化的过程是针对对象进行的,如果一个对象内部包含了对另一个对象的引用,那么在反序列化时,该引用也会被反序列化为对原始对象的引用。
  3. 序列化和反序列化的对象必须是同一个类,否则会抛出 ClassCastException 异常。
  4. 对象的序列化状态可以通过实现 writeObject() 和 readObject() 方法来控制。这些方法允许开发者在序列化和反序列化时自定义存储和读取对象属性的方式,可以更加灵活地控制对象的序列化和反序列化过程。

总结

Java 序列化是一种将 Java 对象转化为字节数组的方式,方便在网络传输或者磁盘存储。要使 Java 对象能够序列化,必须实现 Serializable 接口。Java 序列化通常是使用 ObjectOutputStream 和 ObjectInputStream 类来实现的。在使用 Java 序列化时需要注意一些细节,比如被序列化的属性必须可序列化,反序列化的对象必须是同一类等。开发者也可以通过实现 writeObject() 和 readObject() 方法实现更灵活的序列化和反序列化方式。