学习使用序列化接口

489 阅读2分钟

序列化

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

java序列化

Java语言内置了序列化和反序列化,通过Serializable接口实现。

Serializable

public class Account implements Serializable {
	private String name;
    private String pwd;
}

序列与反序列化

public class TestSerializable {

    public static void serialize(Account account, String fileName) throws IOException {
        // 将Account对象保存到文件中
        FileOutputStream fos = new FileOutputStream(fileName);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(account);
        oos.flush();
        oos.close();
        fos.close();
    }

    public static Account deserialization(String file) throws IOException, ClassNotFoundException {
        // 读取Account的内容
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fis);
        Account account = (Account) ois.readObject();
        ois.close();
        fis.close();
        return account;
    }

    public static void main(String[] args) {
        Account account = new Account();
        account.setName("张三");
        String fileName = "a";
        // 序列化
        try {
            serialize(account,fileName);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 反序列化
        try {
            System.out.println(deserialization(fileName).getName());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

序列化兼容性

序列化的兼容性指的是对象的结构变化(如对属性增删改,属性修饰符改变等)对序列化的影响。为了能够识别对象结构的变化,Serializable使用serialVersionUID字段来标识对象的结构。默认情况下,它会根据对象的数据结构自动生成,结构发生变化后,它的值也会跟随变化。虚拟机在反序列化的时候会检查serialVersionUID的值,如果字节码中的serialVersionUID和要被转换的类型的serialVersionUID不一致,就无法进行正常的反序列化。为了更好的兼容性,在序列化的时候,最好将serialVersionUID的值设置为固定的。

public class Account implements Serializable {
	private static final long serialVersionUID = 1L;
	private String name;
    private String pwd;
}

哪些场景需要序列化

一般来说如果你的对象需要网络传输或者持久化(对象直接转换为字节的形式传输),只要你的对象需要转换为字节的形式那么你的对象就要实现Serializable接口。比如使用dubbo使用rpc的方式调用接口,那么接口参数就一定要实现Serializable接口。

如果只是转换为字符串的形式与网络打交道,那么就不需要实现Serializable接口。