java的序列化与反序列化原理

一、概念

  1.序列化:对象转为二进制字节序列的过程【序列化的作用:在硬盘、数据库中持久化;网络传输;java进程间通信】

  2.反序列化:二进制字节序列转为对象的过程

二、序列化与反序列化的实现

  1.序列化:使用java.io.ObjectOutputStream(对象输出流)的writeObject(Object obj)的方法对参数中指定的object对象,进行目标对象实例序列化,然后写到对应的文件中。

  2.反序列化:使用java.io.ObjectInputStream(对象输入流)的readObject()方法获取字节序列,再将他们反序列化为对象,并返回。

三、序列化与反序列化的要求

  只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。一般都是采用默认的序列化方式。

四、serialVersionUID的作用

  序列化版本号:希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。

  IO流进行反序列化,可以获取到对象实例,但是并不会执行代码和构造方法。

五、序列化demo

@Getter
@Setter
@NoArgsConstructor
public class UserSeriaTest implements Serializable {

    private static final long serialVersionUID = 1L;

    private static String userName = "类123";
    private int age;
    private String sex;

}
public class SeriaTest implements Serializable {

    public static void main(String[] args) throws Exception {
        UserSeriaTest user = new UserSeriaTest();
        user.setAge(19);
        user.setSex("M");
        ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("out.txt"));
        outputStream.writeObject(user);
        outputStream.flush();
        outputStream.close();

        System.out.println("--------序列化输出完成");

        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("out.txt"));
        UserSeriaTest user1 = (UserSeriaTest)inputStream.readObject();

        System.out.println(user1.getAge());
        System.out.println(user1.getSex());

    }
}

 

posted @ 2022-06-26 18:23  风缱云流  阅读(296)  评论(0编辑  收藏  举报