原标题:序列化版本号serialVersionUID的作用

Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象。序列化是Java中实现持久化存储的一种方法;为数据传输提供了线路级对象表示法。

Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。

Eclipse中TheserializableclassXXXXXXdoesnotdeclareastaticfinalserialVersionUIDfieldoftypelong出现这样的警告处理办法。

当采用程序的AdddefaultSerialversionID修复时,Eclipse会加上:privatestaticfinallongserialVersionUID=1L;

当采用程序的AddgeneratedSerialversionID修复时,Eclipse会加上:privatestaticfinallongserialVersionUID=xxxxL;

其实这个问题出现的具体原因是和序列化中的这个serialVersionUID有关。serialVersionUID用来表明类的不同版本间的兼容性。有两种生成方式:一个是默认的1L;另一种是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段。在JDK中,可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID的值,对于Test.class,执行命令:

serialverTest这时JVM(java虚拟机)会生成一个哈希字段。

对比一下这个哈希字段的值与方法2中生成的字段值是一样的,可见,在CMD中使用serialver指令就是根据类名、接口名、成员方法及属性等来生成哈希字段的。

java类中为什么需要重载serialVersionUID属性。

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。把Java对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为Java对象的过程称为对象的反序列化。

对象的序列化主要有两种用途:

1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

2)在网络上传送对象的字节序列。

java.io.ObjectOutputStream代表对象输出流,它的writeObject(Objectobj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。只有实现了Serializable或Externalizable接口的类的对象才能被序列化。Externalizable接口继承自Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以采用默认的序列化方式。凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量:privatestaticfinallongserialVersionUID;类的serialVersionUID的默认值完全依赖于Java编译器的实现,对于同一个类,用不同的Java编译器编译,有可能会导致不同的serialVersionUID。显式地定义serialVersionUID有两种用途:

1)在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。

2)当你序列化了一个类实例后,希望更改一个字段或添加一个字段,不设置serialVersionUID,所做的任何更改都将导致无法反序化旧有实例,并在反序列化时抛出一个异常。如果你添加了serialVersionUID,在反序列旧有实例时,新添加或更改的字段值将设为初始化值(对象为null,基本类型为相应的初始默认值),字段被删除将不设置。

序列化算法一般会按步骤:

将对象实例相关的类元数据输出。

递归地输出类的超类描述直到不再有超类。

类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。

从上至下递归输出实例的数据返回搜狐,查看更多

责任编辑:

java 序列化版本号_序列化版本号serialVersionUID的作用相关推荐

  1. java 对象序列化 数组_序列化-将任何对象转换为j中的字节数组

    您要执行的操作称为"序列化". 有几种方法可以做到,但是如果您不需要花哨的东西,我认为使用标准Java对象序列化就可以了. 也许您可以使用这样的东西? package com.ex ...

  2. 序列化的高阶认识-serialVersionUID的作用

    在IDEA中通过如下设置可以生成serializeid 字面意思上是序列化的版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量 演示步骤 1. 先将user对象序列 ...

  3. java 图像傅里叶变换_傅里叶变换在图像处理中的作用

    傅立叶变换在图像处理中非常的有用.因为不仅傅立叶分析涉及图像处理的很多方面,傅立叶的改进算法, 比如离散余弦变换,gabor与小波在图像处理中也有重要的分量. 印象中,傅立叶变换在图像处理以下几个话题 ...

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

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

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

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

  6. java transient关键字_嗯?你真的会用 Java 序列化机制?

    码农每日一题长按关注,工作日每天分享一个技术知识点. 一.序列化.反序列化概念及其使用场景 1.序列化.反序列化的概念 简单的讲,序列化就是将java对象转化成二进制保存到磁盘中去,反序列化就是从磁盘 ...

  7. java 序列化理解_对Java Serializable(序列化)的理解和总结(二)

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

  8. java序列化深克隆_克隆可序列化和不可序列化的Java对象

    java序列化深克隆 开发人员经常依靠3d方库来避免重新发明轮子,尤其是在Java世界中,Apache和Spring这样的项目如此盛行. 在处理这些框架时,我们通常很少或根本无法控制其类的行为. 这有 ...

  9. java 序列化 文件_一种恢复Java序列化文件数据的方法与流程

    本发明涉及信息安全技术领域,特别涉及一种恢复Java序列化文件数据的方法. 背景技术: 在数据解析恢复领域经常会遇到序列化文件的解析.Java序列化是Java 自身提供的一种数据序列化方式,它允许开发 ...

最新文章

  1. 如何将mysql卸载干净
  2. P1155 双栈排序(二分图染色)
  3. 三、开发调试应用程序
  4. sql2005收集作业相关历史记录
  5. 4.HTTPS与HTTP的区别
  6. FullCalendar 六:FullCalendar应用——拖动与实时保存
  7. Caffe傻瓜系列(1):数据层及参数
  8. 中国网站备案制度——祸国殃民
  9. (已更新)【全开源商城小程序源码】ThinkPHP 5.1+带后台商城源码程序+带详细安装使用文档
  10. Mac 下载安装 Tomcat
  11. PowerBuilder 开发的游戏(找找看)
  12. mac os安装Windows系统失败后不能合并为一个分区
  13. Html5中鼠标经过图片,图片在盒子内部实现放大效果。
  14. C++游戏开发入门项目精选:制作经典游戏拳皇97
  15. 设置局域网内共享磁盘
  16. 46. 常用的数学工具类3-反三角函数的使用
  17. 12-机械键盘和普通键盘的区别
  18. mima.php密码找回,mima.php
  19. 【HTML5初涉】H5与H4的区别
  20. 首都师范学院计算机,2020年首都师范大学计算机应用技术考研分析

热门文章

  1. Java实现碧蓝航线连续作战
  2. ROS修改小乌龟程序背景颜色
  3. 华为云CentOS7.6云耀服务器Python环境基本配置
  4. PyScripter could not load a Python engine解决方案
  5. 1259_STM32CubeProgrammer的简单使用
  6. 公务员面试题:领导干部直播带货,你怎么看?
  7. 抖音快手如何上热门技巧IP定位让你离百万网红只差一步-阿甘电商
  8. 手动开启/关闭macOS HiDPI,让2k显示器完美适配macOS,解决紫屏问题
  9. 外包公司的三大弊端是什么,在此情况下还建议去外包公司吗
  10. 机器学习笔记之马尔可夫链蒙特卡洛方法(三)MH采样算法