写点什么

JAVA 序列化、反序列化以及 serialVersionUID

  • 2022 年 4 月 26 日
  • 本文字数:1340 字

    阅读完需:约 4 分钟

public void setAge(Integer age) {


this.age = age;


}


}


可以看到上面的类 Dog 实现了 Serializable, 标记这个类是可以序列化的。


有人也注意到了,为什么没有弄 serialVersionUID ??


其实咱们如果不手动设置 serialVersionUID,会有默认计算出的 serialVersionUID 的。后面再讨论为什么有手动弄 serialVersionUID 的场景。


结合代码



序列化

import com.jc.mytest.model.Dog;


import java.io.*;


/**


  • @Author : JCccc

  • @CreateTime : 2020/4/21

  • @Description :


**/


public class SerializeTest {


public static void main(String[] args) throws IOException, ClassNotFoundException {


//序列化对象-IO 流-存储


ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\dogInfoText.out"));


Dog dog=new Dog();


dog.setName("阿福");


dog.setAge(1);


objectOutputStream.writeObject(dog);


objectOutputStream.flush();


objectOutputStream.close();


}


}


运行一下,可以看到我们的 D 盘生成了这个 Dog 类型序列化后的文件,



里面全是 ‘乱码’,没事乱码我们看不懂,但是 jvm 能看懂。


反序列化

public class SerializeTest {


public static void main(String[] args) throws IOException, ClassNotFoundException {


ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\dogInfoText.out"));


Dog dog = (Dog) objectInputStream.readObject();


System.out.println("dog's name:"+dog.getName());


}


}


运行结果,跟我们序列化进去的 Dog 设置的字段属性值一样:



序列化和反序列化的简单使用操作已经完毕,作用显然都知道了,简单的理解就是转存为字节流可以方便传输,然后反序列化可以快速地拿到原来的对象。


那么接下来我们来看看为什么要加?serialVersionUID ? 如:


private static final long serialVersionUID = -8567374045705746827L;


private static final long serialVersionUID = 1L;


上面有说过如果我们不手动加这个?serialVersionUID,是会默认生成一个的,只是我们看不到。


上面也有说过,这个 serialVersionUID 就像是这个类的身份证号码一样,具有唯一识别的性质。


举例:


原本我们的 Dog 类只有 2 个字段属性,



然后我们进行了序列化, 这时候,对应默认对应的?serialVersionUID,绑定的内容是这个 Dog,有 2 个字段属性,


已经序列化保存到 D:\\dogInfoText.out 文件里面了。


这时候我们进行一个修改,增加一个字段,nickName 。如:



此时,我们进行反序列化的操作,就会报错:



因为系统默认给之前序列化的 Dog 是生成了一个 serialVersionUID 的,里面绑定的属性只有两个,现在你让三个属性的去接收反序列化后的 Dog 类,且身份证号码不一样,肯定报错了。


这时候避免这种情况的出现,手动设置一个 serialVersionUID 就可以,如:


![](https://img-blog.csdnimg.cn/20200421130940860.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1Mzg3OTQw,size_ 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 16,color_FFFFFF,t_70)


加上 serialVersionUID 之后的 Dog,序列化之后,无论后面怎么修改,只要 serialVersionUID 不变,反序列化就可以正常进行。

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
JAVA 序列化、反序列化以及serialVersionUID_Java_爱好编程进阶_InfoQ写作社区