一、序列化与反序列化
序列化:指把堆内存中的 Java 对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络节点(在网络上传输)。这个过程称为序列化。通俗来说就是将数据结构或对象转换成二进制串的过程。
反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。也就是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
总结一下:序列化的思想就是“冷冻”对象状态,然后写到磁盘或者网络传输中;反序列化的思想“解冻”对象状态,重新获得可用的Java对象。
二、为什么序列化?
好处一是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里),二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。
三、怎么进行序列化?
实现 java.io.Serializable 这个接口,我们来看一下这个接口
* @author unascribed
* @see java.io.ObjectOutputStream
* @see java.io.ObjectInputStream
* @see java.io.ObjectOutput
* @see java.io.ObjectInput
* @see java.io.Externalizable
* @since JDK1.1
*/
public interface Serializable {
}
这不什么都没有吗?我去竟然还是从Java远古时代就有了这个接口
原来:serializable接口只是一个标识接口,没有任何抽象方法。
四、实例
package com.springboot.serializable.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class User implements Serializable {
private String name;
private int age;
}
package com.springboot.serializable.entity;
import java.io.*;
public class SerializableDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//给对象赋值
User user = new User();
user.setName("张三丰");
user.setAge(108);
System.out.println(user);
//序列化对象到文件中
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("file"));
objectOutputStream.writeObject(user);
objectOutputStream.close();
//反序列化
File file = new File("file");
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
User newUser = (User) objectInputStream.readObject();
System.out.println("反序列化:"+newUser.toString());
}
}
输出结果:
User(name=张三丰, age=108)
反序列化:User(name=张三丰, age=108)
看了代码是不是知道了,serializable其实就是一个标识作用,真正的序列化是Java使用对象流来完成的。
ObjectOutputStream:通过 writeObject()方法做序列化操作
ObjectInputStream:通过 readObject() 方法做反序列化操作
五、序列化版本问题
在完成序列化操作后,由于项目的升级或修改,可能我们会对序列化对象进行修改,比如增加某个字段,那么我们在进行反序列化就会报错:
解决办法是在JavaBean对象中添加一个serialVersionUID 字段,用来固定这个版本,无论我们怎么修改,版本都是一致的,就能进行反序列化了
private static final long serialVersionUID = 8656128222714547171L;