文章目录

  • 1、为什么要序列化
  • 2、序列化版本号的用处
  • 3、如何设定版本号
  • 4、自己试验序列化、反序列化
  • 5、IDEA中如何自动生成serialVersionUID
  • 6、Transient 关键字
  • 7、序列化的对象范围

1、为什么要序列化

一些场景下需要把对象转变成字节序列

  • 保存到存储介质上(磁盘等)
  • 用于网络传输

一个很常见的应用是dubbo的RPC调用,如果参数是一个bean,那么远程调用的时候必然需要传递参数对象,这时候就必须将转变为字节序列(序列化)然后通过网络传输

2、序列化版本号的用处

在 序列化存储/反序列化读取 或者是 序列化传输/反序列化接收 时,JVM 会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。

在对实体类进行不影响业务流程的升级时,比如只追加了一个附加信息字段,可以不改变序列化版本号,来实现新旧实体类的兼容性(接收方的类里没有的字段被舍弃;多出来的字段赋初始值)。

3、如何设定版本号

  1. 手动控制版本号
private static final long serialVersionUID = 1L;

实体类升级以后,可以手动控制版本号升级与否。

  1. 让IDE根据类名、接口名、成员方法及属性等来自动生成一个64位的哈希字段
private static final long serialVersionUID = XXXL;

大部分IDE都提供了自动生成这个哈希数的功能(对于实现了Serializable接口的类都有提示)。

  1. 不显示定义 serialVersionUID 。

在这种情况下 jvm 会根据类的内容自动生成 serialVersionUID,如果对类的源代码作了修改,再重新编译,新生成的类文件的serialVersionUID值会发生变化。

而且类的serialVersionUID的默认值完全依赖于Java编译器的实现,对于同一个类,用不同的Java编译器编译,也有可能会导致不同的serialVersionUID。

4、自己试验序列化、反序列化

想学习序列化相关知识,自己做试验时,一种方法是可以简单地使用dubbo的远程调用;

另外也可以像下面这样做对象的保存和读取

public void saveObject() {try {FileOutputStream fos = new FileOutputStream(new File("FileFullpath&Name"));ObjectOutputStream os = new ObjectOutputStream(fos);SerializableDemo s = new SerializableDemo();os.writeObject(s);os.flush();os.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public void readObject() {try {FileInputStream fis = new FileInputStream(new File("FileFullpath&Name"));ObjectInputStream ois = new ObjectInputStream(fis);SerializableDemo s2 = (SerializableDemo) ois.readObject();System.out.println(s2.getB());ois.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}

5、IDEA中如何自动生成serialVersionUID

与Eclipse不同,IDEA并没有提供自动生成serialVersionUID的功能,可以通过安装 GenerateSerialVersionUID 插件来解决这个问题。

6、Transient 关键字

Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值。

除了使用 Transient 关键字以外,还可以将不需要被序列化的字段抽取出来放到父类中,子类实现 Serializable 接口,父类不实现,根据父类序列化规则,父类的字段数据将不被序列化。

7、序列化的对象范围

在有些情况下,要注意一个容易混淆的问题:序列化针对的是“对象”,类的成员变量(static)是不会被序列化保存或者传输的,毕竟一个存在堆内存,一个存在方法区。

序列化版本号(serialVersionUID)是做什么用的相关推荐

  1. java 四字节uid,Java入门教程-序列化版本号serialVersionUID的作用

    原标题:Java入门教程-序列化版本号serialVersionUID的作用 Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象.序列化是Java中实现持久化存储的一种方法 ...

  2. java 序列化版本号_序列化版本号serialVersionUID的作用

    原标题:序列化版本号serialVersionUID的作用 Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象.序列化是Java中实现持久化存储的一种方法:为数据传输提供了 ...

  3. Java序列化之serialVersionUID

    Java序列化之serialVersionUID 今天讲一讲Java对象中的serialVersionUID,先从序列化讲起. 什么是序列化 序列化,简单的说,就是将一个对象转化(编码)成可以传输的输 ...

  4. eclipse序列化生成serialVersionUID

    eclipse序列化生成serialVersionUID serialVersionUID作用: 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性. 如果你修改代码重新部署后出现 ...

  5. 【Java基础】序列化之serialVersionUID

    为什么需要serialVersionUID? 序列化很大部分的作用是持久化到本地中,那么有个问题就是如果在还原也就是反序列化这些本地数据的时候,原先的类结构已经发生了改变,存在本地的数据代表着的是旧的 ...

  6. 序列化的 serialVersionUID 到底有什么用?

    作者:学无止境 来源:www.cnblogs.com/duanxz/p/3511695.html 实现Serializable接口的目的是为类可持久化,比如在网络传输或本地存储,为系统的分布和异构部署 ...

  7. java中序列化的serialVersionUID解释

    serialVersionUID: 字面意思上是序列化的版本号,这个在刚刚接触java编程时,学序列化大家一般都不会注意到,在你一个类序列化后除非你强制去掉了myeclipse中warning的功能, ...

  8. java 序列化 uid_一文看懂Java序列化之serialVersionUID

    serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的 ...

  9. 探析“Java序列化”之serialVersionUID

    未显式指定serialVersionUID 当没有显式地定义serialVersionUID变量时,Java序列化机制会根据编译的class自动生成一个serialVersionUID作序列化版本,它 ...

最新文章

  1. Access里执行SQL
  2. php 清除缓存的操作,PHP清除缓存的几种方法
  3. hoj 3005 Game Rigging 强联通分量求缩点
  4. linux nginx安装
  5. php getcount_PHP中关键字interface和implements详解
  6. php项目课题,php课题
  7. c#获取对象的唯一标识_DDD领域驱动设计实战 - 创建实体身份标识的常用策略
  8. python 字典由值找键,从Python中的Dictionary中的值获取键
  9. akamai:与看视频广告等待相比,用户更不能忍受缓冲等待
  10. Matlab-中寻找峰值函数,波峰波谷
  11. Python中Selenium设置无界面访问
  12. 信息与通信的数学基础——Mathematic入门
  13. Hive教程(02)- Hive安装
  14. 《人生七年》-------殊途同归
  15. 简述python语言的主要功能和特点_python语言的特点有哪些
  16. 月中工作总结_在全职工作的9个月中,我是如何从新手转到软件工程师的
  17. 神级程序员都在用什么工具?【建议收藏】
  18. Confluence团队协同工具使用文档
  19. BI学习笔记之六 - 数据仓库介绍
  20. 菜鸡学Unity 之 了解 Unity 中的五个视图窗口

热门文章

  1. Python输出[m,n]既能被3整除又能被7整除的数的个数
  2. ncre计算机职业英语,NCRE计算机职业英语一级考试样卷
  3. Dynamics 365 SiteMap Designer
  4. Altium Designer--如何添加泪滴
  5. 【基于TCP的在线词典】
  6. excel中时间差的计算
  7. 该设备正在使用中.请关闭可能使用该设备的所
  8. 视频号账号定位怎么做?如何做微信视频号定位
  9. 电子计算机发展经历几个阶段,计算机的发展经历几个阶段?每个阶段的电子原件及特征主要概述...
  10. 燕麦粉行业调研报告 - 市场现状分析与发展前景预测