1、序列化和反序列化的概念

  • 序列化:把对象转换为字节序列的过程。
  • 反序列化:把字节序列恢复为对象的过程称。

2、什么情况下需要序列化

  • 把内存中的对象状态保存到一个文件中或者数据库中时候;
  • 用套接字在网络上传送对象的时候;
  • 通过RMI传输对象的时候;

3、如何实现序列化

实现Serializable接口即可

package com.cjian.ser;import java.io.Serializable;/*** @Author: cjian* @Date: 2022/2/23 14:20* @Des:*/
public class FlyPig implements Serializable {//static final long serialVersionUID = 1L;private static String AGE = "26";private String name;private String color;transient private String car;//private String addTip;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public String getCar() {return car;}public void setCar(String car) {this.car = car;}/* public String getAddTip() {return addTip;}public void setAddTip(String addTip) {this.addTip = addTip;}*/@Overridepublic String toString() {return "FlyPig{" +"name='" + name + '\'' +", color='" + color + '\'' +", car='" + car + '\'' +//", addTip='" + addTip + '\'' +'}';}
}

测试:

package com.cjian.ser;import java.io.*;/*** @Author: cjian* @Date: 2022/2/23 14:22* @Des:*/
public class SerializableTest {/*** 序列化*/private static void serializeFlyPig() throws IOException {FlyPig flyPig = new FlyPig();flyPig.setColor("black");flyPig.setName("naruto");flyPig.setCar("oooo");// ObjectOutputStream 对象输出流,将 flyPig 对象存储到G盘的 flyPig.txt 文件中,完成对 flyPig 对象的序列化操作ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("G:/flyPig.txt")));oos.writeObject(flyPig);System.out.println("FlyPig 对象序列化成功!");oos.close();}/*** 反序列化*/private static FlyPig deserializeFlyPig() throws Exception {ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("G:/flyPig.txt")));FlyPig person = (FlyPig) ois.readObject();System.out.println("FlyPig 对象反序列化成功!");return person;}public static void main(String[] args) throws Exception {serializeFlyPig();FlyPig flyPig = deserializeFlyPig();System.out.println(flyPig.toString());}
}

从运行结果上看:
1、实现了对象的序列化和反序列化。
2、transient 修饰的属性,是不会被序列化的。我设置的ca不见啦,成了null。
3、这个静态变量AGE也被序列化啦。真的被序列化了吗?  接下来验证下

修改main方法,先执行序列化:

修改AGE属性为 26,然后执行反序列化

结果:

可以看到,刚刚序列化时的269,没有反序列化出来,反序列化出来的而是刚刚修改的26,
所以,得出结论,这个静态static的属性,它不序列化。

4、serialVersionUID 的作用和用法

①我们先去掉serialVersionUID 接口,然后执行后面的序列化和反序列化的方法,

直接出异常:

还和上面的操作差不多,先是单独执行序列化方法。生成文件。
    然后,打开属性 addTip ,这之后,再次执行反序列化方法,看现象。

bean里面是没有明确的给这个 serialVersionUID 赋值,但是,Java会自动赋值的,这个值是根据这个bean的属性计算出来的。序列化的时候,还没有这个addTip属性,所以,自动生成的serialVersionUID 这个值和在我反序列化的时候Java自动生成的这个serialVersionUID值是不同的,就抛异常了(也可以反过来测,带ID去序列化,然后,没ID去反序列化。也是同样的问题)。

③再来一次,就是先序列化,这个时候,把 private static final long serialVersionUID = 1L; 这行代码的注释打开。那个addTip属性先注释掉,序列化之后,再把这个属性打开,再反序列化。看看什么情况。

这个现象的意义:

确保了一个bean在序列化与反序列化时的一个唯一性

所以,有这么个理论,就是在实现这个Serializable 接口的时候,一定要给这个 serialVersionUID 赋值

如何给 serialVersionUID 赋值呢?

使用编码工具自动生成的即可,如idea:

File -> Settings -> Editor -> Inspections -> 搜索 Serialization issues ,找到 Serializable class without 'serialVersionUID' ->打上勾,Apply->OK

自动生成的:

5、其它:

可序列化类的所有子类型本身都是可序列化的。因为实现接口也是间接的等同于继承。
序列化接口没有方法或字段,仅用于标识可序列化的语义。

序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException。可序列化类可以通过声明名为 “serialVersionUID” 的字段(该字段必须是静态 (static)、最终 (final) 的 long 型字段)显式声明其自己的 serialVersionUID:

  如果可序列化类未显式声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认 serialVersionUID 值,如“Java™ 对象序列化规范”中所述。不过,强烈建议 所有可序列化类都显式声明 serialVersionUID 值,原因是计算默认的 serialVersionUID 对类的详细信息具有较高的敏感性,根据编译器实现的不同可能千差万别,这样在反序列化过程中可能会导致意外的 InvalidClassException。因此,为保证 serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值。还强烈建议使用 private 修饰符显示声明 serialVersionUID(如果可能),原因是这种声明仅应用于直接声明类 – serialVersionUID 字段作为继承成员没有用处。数组类不能声明一个明确的 serialVersionUID,因此它们总是具有默认的计算值,但是数组类没有匹配 serialVersionUID 值的要求。

序列化和反序列化的概念及应用相关推荐

  1. 序列化和反序列化的概念与延伸【详细解释 + 样例演示】

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化:把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放 ...

  2. 序列化和反序列化的概念_序列化的概念

    序列化和反序列化的概念 讨论了为什么Optional不可序列化以及如何处理(即将推出)之后,让我们仔细看看序列化. 总览 这篇文章介绍了序列化的一些关键概念. 它尝试精简地执行此操作,而不会涉及太多细 ...

  3. Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释

    遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题 a,什么叫序列化和反序列化 b,作用.为啥要实现这个 Serializable 接口,也就是为啥要序列化 c,se ...

  4. Java 之 Serializable 序列化和反序列化的概念,作用的通俗的解释

    1.序列化和反序列化的疑问 遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题 a,什么叫序列化和反序列化 b,作用.为啥要实现这个 Serializable 接口, ...

  5. Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释【转】

    转载自:https://blog.csdn.net/qq_27093465/article/details/78544505 遇到这个 Java Serializable 序列化这个接口,我们可能会有 ...

  6. Java基础学习总结——Java对象的序列化和反序列化

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...

  7. 面试:什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决?...

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | riemann_ 来源 | blog.csdn ...

  8. Java基础学习总结(14)——Java对象的序列化和反序列化

    2019独角兽企业重金招聘Python工程师标准>>> 一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象 ...

  9. 序列化与反序列化_序列化和反序列化JAVA成长之路

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化.把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放 ...

最新文章

  1. 【ACM】杭电OJ 2005
  2. Java“拍了拍”你,面试其实没那么难...
  3. 复旦计算机测试,复旦大学计算机用能力水平测试(Fudan Computer Skills.doc
  4. 【转】Nginx反向代理和负载均衡
  5. 支付宝支付 - 构建支付表单填并提交
  6. SharePoint2013 Excel导出好的代码
  7. Java8————Base64
  8. Spring Cloud微服务之模块依赖修改(六)
  9. Webstorm的常用快捷键
  10. 文本相似度-bm25算法原理及实现
  11. 破解版软件-20131014更新
  12. 全球十大黑客(第一让你不敢想象)
  13. Java POI word常用方法 在Cell插入子表格
  14. 生活之一米之外就是阳光
  15. 计算机应用程序无响应,电脑上应用程序很容易未响应,怎么办?
  16. Doxygen 一个程序的文件产生工具,可将程序中的特定批注转换成为说明文件
  17. ui设计移动端字体适配_移动端字体ui设计 移动端界面设计规范
  18. failed to copy ‘xxx‘ to ‘system/bin/xxx‘: remote couldn‘t create file: Read-only file system
  19. wnmp mysql_wnmp配置(windows+nginx+mysql+php开发环境)
  20. delphi 复制到剪贴板_Delphi中的基本剪贴板操作(剪切/复制/粘贴)

热门文章

  1. 【FI】统驭科目记账与特殊记账
  2. 绝对水题(一些没有被穷举遗忘的角落)
  3. 网桥、交换机、路由器等的区别
  4. 部署N9e-v3运维监控平台
  5. 明翰经验系列之管理篇V1.1(持续更新)
  6. 中文真伟大!竟然有只能看,不能读的文章
  7. matlab仿真 多胞体,四维空间(三):谈正多胞体
  8. 锂电池和锂离子电池的区别
  9. 【javascript 】组合式继承
  10. RabbitMQ总结