原标题:Java入门教程-序列化版本号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 四字节uid,Java入门教程-序列化版本号serialVersionUID的作用相关推荐

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

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

  2. java和python自学教程_适合 Java开发者学习的Python 入门教程—文海思创

    原标题:适合 Java开发者学习的Python 入门教程-文海思创 [文海思创讯]在Java文章频道里,我们大部分人应该对该语言都非常的了解,而且在该生态圈内至少已经呆了好几年了.这让我们有常规和专业 ...

  3. Java 8 Lambda表达式官方入门教程(包括Lambda表达式介绍和语法)

    Java8做出了比较大的更新,支持了很多新特性,Java8引入的Lambda表达式这一特性,使Java8支持函数式编程,目前网上有较多的教程,本文整理了来自Oralce官方提供的教程. Lambda表 ...

  4. Java爬虫代码示例|入门教程 1- 快速爬取百度美图

    文章目录 前言 源码 参考 前言 说起搜索,大家一定对百度不陌生.每个搜索引擎后边都是一个大型爬虫调度系统. 第一篇我们先以百度为例 每天都被它爬,今天我们来爬一下它. 源码 url分析 https: ...

  5. JAVA单字节读取,java资料读取。(单字节读取和按行读取读取)

    当前位置:我的异常网» 编程 » java资料读取.(单字节读取和按行读取读取) java资料读取.(单字节读取和按行读取读取) www.myexceptions.net  网友分享于:2013-12 ...

  6. java final 变量 回收_java入门教程-Java中final,finally,finalize三个关键字的区别

    final 当这个关键字修饰一个类时,意味着他不能派生出新的子类,也就是说不能被继承,因此一个类不能被同时声明为abstract和final.当final修饰变量或者方法时,可以保证他们在使用中不会被 ...

  7. Java开发工具IntelliJ IDEA入门教程:代码片段和代码折叠

    本文将介绍在IntelliJ IDEA 使用过程中的 代码片段和代码折叠相关内容. IntelliJ IDEA官方正版下载 代码片段 与全局操作系统快捷方式冲突 预定义的键盘映射并不涵盖所有可能的平台 ...

  8. java 怎么做卷积运算,入门教程之算法系列(二):卷积运算与模糊操作

    卷积在信号处理领域有极其广泛的应用,也有严格的物理和数学定义. OpenCV中对图像进行模糊操作,其背后的原理就是卷积运算,可是究竟卷积运算是什么,模糊的卷积算法又是如何实现的呢?本文将进行讨论.考虑 ...

  9. java异常 字节码,Java字节码角度分析异常处理

    目录 从字节码角度来分析:异常处理 1.1 异常-catch // 从字节码角度来分析:异常处理 public class T13_ByteAnalyseException { public stat ...

最新文章

  1. windows 8 修改文件权限
  2. Task On The Board CodeForces - 1367D(思维)
  3. android touch事件坐标原点,Android onTouch事件与手势操作
  4. dpdk的无锁环形队列Ring
  5. 私活后的 WPF 设计经验总结
  6. leetcode——给定一个字符串,求不重复字符的最长子字符串的长度
  7. 办公搜索利器UTOOLS-基于EVERYTHING的文件快速搜索软件
  8. 液压控制系统的simulink搭建
  9. 浏览器打开是360导航页面解决方法
  10. cf----2019-10-06(Slime,Shashlik Cooking,Mysterious Crime)
  11. word2vec源码详解
  12. 计算机网络——单播、多播(组播)、广播
  13. 第一次学习Web的总结
  14. 微信小程序注册使用教程
  15. 数据湖之Hudi基础:核心原理
  16. apche的设置和安装
  17. ELO kernels 记录
  18. SQL-3(数据筛选)
  19. STM32的一键下载CH340 DTR RTS与复位电路NRST的学习笔记
  20. 5.网络、网络控制、网络通信

热门文章

  1. SonarQube系列一、Linux安装与部署
  2. C#8.0可空引用类型的使用注意要点 1
  3. NET Core微服务之路:基于Ocelot的API网关Relay实现--RPC篇
  4. C# 接受MQTT服务器推送的消息
  5. .NET Core中的性能测试工具BenchmarkDotnet
  6. ASP.NET Core 源码学习之 Options[4]:IOptionsMonitor
  7. ASP.NET Core MVC 源码学习:Routing 路由
  8. c语言兔子洞,数据结构水题选讲 - osc_y08db3kb的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. Linux中的vi和vim
  10. java 1.7的新特性_[Java]  JDK 1.7版本的 新特性