序列化和反序列化的概念
当我们在Java中创建对象的时候,对象会一直存在,直到程序终止时。但有时候可能存在一种”持久化”场景:我们需要让对象能够在程序不运行的情况下,仍能存在并保存其信息。当程序再次运行时 还可以通过该对象的保存下来的信息 来重建该对象。序列化和反序列化 就应运而生了, 序列化机制可以使对象可以脱离程序的运行而独立存在。
- 序列化 : 将对象转换成二进制字节流的过程
- 反序列化 :从二进制字节流中恢复对象的过程
应用场景?
- 对象在进行 网络传输 的时候,需要先被序列化,接收到序列化的对象之后需要再进行反序列化;比如远程方法调用 RPC
- 将对象存储到 文件 中的时候需要进行序列化,将对象从文件中读取出来需要进行反序列化。
- 将对象存储到 内存 中,需要进行序列化,将对象从内存中读取出来需要进行反序列化。
- 将对象存储到 数据库 (如 Redis)时,需要用到序列化,将对象从缓存数据库中读取出来需要反序列化。
序列化实现的方式
如果使用Jdk自带的序列化方式实现对象序列化的话,那么这个类应该实现Serializable接口或者Externalizable接口
继承Serializable接口,普通序列化
首先我们定义一个对象类User
public class User implements Serializable { //序列化ID private static final long serialVersionUID = 1L; private int age; private String name; public User(int age, String name) { this.age = age; this.name = name; } public static long getSerialVersionUID() { return serialVersionUID; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
然后我们编写一下测试类:
public class serTest { public static void main(String[] args) throws Exception, IOException { SerializeUser(); DeSerializeUser(); } /** * 序列化方法 * @throws IOException */ private static void SerializeUser() throws IOException { User user = new User(11, "小张"); //序列化对象到指定的文件中 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\jun\\Desktop\\example")); oos.writeObject(user); oos.close(); System.out.println("序列化对象成功"); } /** * 反序列化方法 * @throws IOException * @throws ClassNotFoundException */ private static void DeSerializeUser() throws IOEx