Skip to content

Java中的序列化和反序列化是什么?

648字约2分钟

2024-09-12

在Java中,序列化反序列化是两个与对象持久化和传输相关的重要概念,通常用于将对象的状态转换为可以存储或传输的格式,并且在需要时可以重新构建对象。

1. 序列化(Serialization)

序列化是指将一个Java对象的状态转换为字节流的过程。序列化后的字节流可以保存到文件、数据库,或者通过网络传输。序列化常用于将对象持久化或通过网络发送。

在Java中,要使一个类的对象可以序列化,该类必须实现java.io.Serializable接口,这是一个标记接口(没有方法),仅表明该类可以被序列化。

示例:

import java.io.*;

class Person implements Serializable {
    private static final long serialVersionUID = 1L; // 用于版本控制
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class SerializationExample {
    public static void main(String[] args) {
        Person person = new Person("Alice", 30);
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
            oos.writeObject(person); // 序列化对象
            System.out.println("对象已序列化");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,我们将一个Person对象序列化并写入到文件person.ser中。

2. 反序列化(Deserialization)

反序列化是指将字节流转换回Java对象的过程。通过反序列化,可以从文件、数据库或网络中恢复对象的状态。

示例:

import java.io.*;

public class DeserializationExample {
    public static void main(String[] args) {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
            Person person = (Person) ois.readObject(); // 反序列化对象
            System.out.println("对象已反序列化");
            System.out.println("Name: " + person.name + ", Age: " + person.age);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

这里,我们从person.ser文件中读取字节流并将其反序列化为Person对象。

注意事项

  1. serialVersionUID:序列化时会自动生成一个serialVersionUID字段,用于版本控制。如果类的结构发生变化,比如字段新增或删除,serialVersionUID不同,反序列化时可能会出现InvalidClassException异常。因此,建议显式定义serialVersionUID
  2. transient 关键字:如果某个字段不想参与序列化,可以用transient修饰。例如:
    transient int tempField; // 该字段不会被序列化
  3. 继承:一个类的父类不需要实现Serializable接口,只有需要序列化的类本身必须实现这个接口。

常见应用

  • 分布式系统:在网络中传输Java对象。
  • 缓存:将对象的状态保存到磁盘或内存中以便后续快速恢复。
  • 持久化:将对象的状态持久化到文件或数据库中。