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()); } }