📜  Java中的序列化和反序列化(1)

📅  最后修改于: 2023-12-03 15:16:32.668000             🧑  作者: Mango

Java中的序列化和反序列化

Java中的序列化和反序列化是处理对象持久化和通信的两个重要概念。

序列化

Java中的序列化指将一个对象转换成字节流,以便在网络上传输或者保存到本地磁盘中。序列化可以用于实现数据的持久化,使得对象可以长久的存储在本地的磁盘上,等需要时再将其反序列化出来使用。

Java中的序列化是通过实现Serializable接口来实现的。示例代码如下:

import java.io.Serializable;

public class Person implements Serializable {
    private static final long serialVersionUID = 1L;

    private String name;
    private int age;

    // getter 和 setter 方法省略

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

代码中我们自定义了一个人物类Person,实现了Serializable接口。这样,Person类就可以被序列化和反序列化了。

对于一个序列化对象,可以使用ObjectOutputStream来将其写入到输出流中,示例代码如下:

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class SerializeDemo {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("Tom");
        person.setAge(18);

        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"))) {
            oos.writeObject(person);
            oos.flush();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

代码中我们将一个Person对象写入到本地的person.dat文件中。注意,写入到输出流中的对象必须是实现了Serializable接口的类。

反序列化

Java中的反序列化指将一个字节流转换成对象,以便在程序中使用。反序列化可以用于网络通信或者本地文件读取,可以将一个已经序列化的对象重新还原成原来的状态。

对于一个序列化的对象,可以使用ObjectInputStream来将其读取出来,示例代码如下:

import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class DeserializeDemo {
    public static void main(String[] args) {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"))) {
            Person person = (Person) ois.readObject();
            System.out.println(person.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

代码中我们从本地的person.dat文件中读取一个Person对象,并将其转换成实例。注意,读取到的对象必须进行类型转换。

序列化ID

序列化ID是一个很重要的概念,它用于版本控制,可以保证在不同的版本中反序列化仍然能够正确无误。

Java会根据类的各种特征信息如属性、方法、父类等来生成一个唯一的序列化ID,当类发生改变时,序列化ID也会相应发生改变。为了保证版本兼容,可以自定义序列化ID。

示例代码如下:

import java.io.Serializable;

public class Person implements Serializable {
    private static final long serialVersionUID = 2L; // 自定义序列化ID

    private String name;
    private int age;

    // getter 和 setter 方法省略

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

代码中我们自定义了一个序列化ID为2,这样即使Person类的属性发生改变,我们还是可以反序列化成功。

总结

Java中的序列化和反序列化是处理对象持久化和通信的两个重要概念。序列化可以将一个对象转换成字节流,以便在网络上传输或者保存到本地磁盘中;反序列化可以将一个字节流转换成对象,以便在程序中使用。在序列化过程中,需要注意自定义序列化ID,以保证版本兼容。