跳至主要內容

序列化


序列化

序列化的概念

Java中的序列化是指将Java对象转换为字节流的过程,以便将其存储到文件中或通过网络传输。序列化可以让Java对象在不同的Java虚拟机之间进行通信,并且可以使对象在程序重启后仍然保持状态。

Java中的序列化是通过实现Serializable接口来完成的。如果一个类实现了Serializable接口,它的对象就可以被序列化和反序列化。序列化可以通过使用ObjectOutputStream类将Java对象转换为字节流,反序列化可以通过使用ObjectInputStream类将字节流转换回Java对象。

需要注意的是,序列化只能序列化对象的状态,而不能序列化类的代码。因此,在反序列化时需要确保类的代码已经存在,否则会抛出ClassNotFoundException异常。

Java中的序列化还有一些高级特性,比如可以通过实现Externalizable接口来自定义序列化过程,以及可以使用transient关键字来标记不需要被序列化的字段。此外,Java中还提供了一种称为Java序列化XML的机制,它可以将Java对象序列化为XML格式的数据。

序列化示例

好的,下面是一个简单的Java对象的序列化和反序列化示例:

import java.io.*;

public class SerializationExample {
    public static void main(String[] args) {
        // 创建一个Person对象
        Person person = new Person("张三", 20);
  
        // 将Person对象序列化到文件中
        try (ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream("person.ser"))) {
            oos.writeObject(person);
            System.out.println("Person对象已经被序列化到文件中");
        } catch (IOException e) {
            e.printStackTrace();
        }
  
        // 从文件中反序列化Person对象
        try (ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream("person.ser"))) {
            Person deserializedPerson = (Person) ois.readObject();
            System.out.println("从文件中反序列化出的Person对象为:" + deserializedPerson);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;

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

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

这个示例中,我们定义了一个名为Person的类,它实现了Serializable接口。然后我们创建了一个Person对象,将其序列化到文件中,再从文件中反序列化出Person对象,并打印出其内容。

需要注意的是,我们在Person类中定义了一个serialVersionUID字段,它是Java序列化机制中用于判断序列化对象和反序列化对象是否兼容的版本号。如果序列化对象和反序列化对象的serialVersionUID不一致,就会导致反序列化失败。因此,我们在定义可序列化的类时通常都要显式地声明serialVersionUID。

上次编辑于:
贡献者: Neil