为什么要在Java的Serializable类中使用SerialVersionUID

序列化和SerialVersionUID始终是许多Java开发人员的难题。 我经常会看到类似此SerialVersionUID的问题,或者如果不在我的Serializable类中声明SerialVersionUID会发生什么情况? 除了涉及到的复杂性和罕见的使用之外,这些问题的另一个原因是Eclipse IDE发出警告,警告不要缺少SerialVersionUID,例如“ Serializable类Customer不会声明long类型的静态最终SerialVersionUID字段” 。 在本文中,您不仅将学习Java SerialVersionUID的基础知识,而且还将了解其在序列化和反序列化过程中的作用。 通过实现标记接口java.io.Serializable将一个类声明为Serializable时,如果您尚未使用Externalizable接口自定义该过程,则Java运行时将使用默认的Serialization机制将该类的实例持久化到磁盘中。 在序列化过程中,Java运行时会为一个类创建一个版本号,以便以后可以反序列化它。 此版本号在Java中称为SerialVersionUID 。 如果在反序列化过程中,SerialVersionUID不匹配,则过程将失败,并在线程“ main” java.io.InvalidClassException中以InvalidClassException作为Exception ,同时还会打印类名和相应的SerialVersionUID。 解决此问题的快速解决方案是复制SerialVersionUID并将其声明为类中的私有静态最终长常量。 在本文中,我们将了解为什么要在Java中使用SerialVersionUID以及如何使用serialver JDK工具生成此ID。 如果您不熟悉序列化,还可以查看“ 十大Java序列化面试”问题,以评估您的知识并找到理解上的空白以供进一步阅读。 与并发和多线程类似,序列化是另一个主题,值得一读。

就像我说的那样,当我们不声明SerialVersionUID作为类中的静态,最终值和长整型值时,序列化机制会为我们创建它。 该机制对许多细节敏感,包括您的类中的字段,访问修饰符,它们实现的接口,甚至不同的Compiler实现,对类的任何更改或使用不同的编译器都可能导致产生不同的SerialVersionUID ,许多最终都会停止重新加载序列化的数据。 依靠Java序列化机制生成此id太冒险了,这就是为什么建议在Serializable类中声明显式SerialVersionUID的原因。 我强烈建议阅读Joshua Bloch的经典Java标题“ Effective Java”,以了解Java序列化和不正确处理它的问题。 顺便说一下,JDK还提供了一个名为serialver的工具,位于我的机器C:\ Program Files \ Java \ jdk1.6.0_26 \ bin \ serialver.exe的JAVA_HOME文件夹的bin目录中,该工具可用于为旧版本生成SerialVersionUID类。 如果您在类中进行了更改(这会破坏序列化并且您的应用程序无法重新加载序列化的实例),这将非常有用。 您可以简单地使用此工具为旧实例创建SerialVersionUID,然后通过声明一个private , static , final和long SerialVersionUID字段在类中显式使用它。 顺便说一句,出于性能和安全性的考虑,强烈建议您使用自定义二进制格式进行序列化,Effective Java再次提供了几项,这详细解释了自定义格式的优点。

您可以使用JDK的serialver工具为类生成SerialVersionUID。 这对于正在发展的类特别有用,它以易于复制的格式返回SerialVersionUID。 您可以使用serialver JDK工具,如以下示例所示:

$ serialver
use: serialver [-classpath classpath] [-show] [classname...]$ serialver -classpath . Hello
Class Hello is not Serializable.$ serialver -classpath . Hello
Hello:    static final long SerialVersionUID = -4862926644813433707L;

您甚至可以通过运行命令$ serialver -show以GUI形式使用serialver工具,这将打开串行版本检查器,该检查器将使用完整的类名并显示其串行版本。

现在我们知道什么是SerialVersionUID以及为什么在Serializable类中声明它很重要,是时候修改一些与Java SerialVersionUID相关的重要事实了。

  1. SerialVersionUID用于对序列化数据进行版本控制。 如果类的SerialVersionUID与序列化的实例匹配,则只能反序列化该类。
  2. 当我们不在类中声明SerialVersionUID时,Java运行时会为我们生成它,但是该过程对许多类元数据敏感,包括字段数,字段类型,字段访问修饰符,由类实现的接口等。您可以在Oracle的序列化文档中找到准确的信息。
  3. 建议将SerialVersionUID声明为私有静态最终长型变量,以避免使用默认机制。 如果您错过了某些Eclipse之类的 IDE,也会显示警告,例如“ Serializable类Customer不会声明long类型的静态最终SerialVersionUID字段” 。 尽管可以通过转到窗口>首选项> Java>编译器>错误/警告>潜在的编程问题来禁用此警告,但我建议不要这样做。 唯一的情况是,在不需要恢复数据时,我会很粗心。 这是该错误在Eclipse IDE中的样子,您需要做的就是接受第一个快速修复。
  4. 什么是Java中的SerialVersionUID以及为什么需要它

  5. 您甚至可以使用JDK中的serialver工具为Java中的类生成Serial Version。 它还具有一个GUI,可以通过传递-show参数来启用它。
  6. 明确声明SerialVersionUID是Java的序列化最佳实践,以避免在反序列化期间出现任何问题,尤其是在运行依赖于序列化数据的客户端服务器应用程序(例如RMI)的情况下。

这就是Java中的SerialVersionUID的全部内容。 现在我们知道了为什么在类中声明SerialVersionUID很重要。 您可以感谢您的IDE的提醒,这可能会破坏您的类的反序列化。

如果您想了解有关序列化和相关概念的更多信息,还可以看到以下精彩文章:

  • Java中瞬时变量和易失变量之间的区别
  • Java中Serializable和Externalizable接口之间的区别
  • 何时在Java中使用瞬时变量

翻译自: https://www.javacodegeeks.com/2014/05/why-use-serialversionuid-inside-serializable-class-in-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL2005-使用openrowset 里读取excel文件

很多时候我们都知道使用.net代码去读取word,excel文档,但是我们如何使用sql句语里读取excel文件呢:SQL2005为我们提供了OPENROWSET来访问各种数据源:,当然我还是建议使用.net代码来读取这些文件。这里就不多说了。 我们先看一下官方的解释&am…

Java中的SynchronousQueue示例–生产者使用者解决方案

SynchronousQueue是BlockingQueue的一种特殊类型,其中每个插入操作必须等待另一个线程进行相应的删除操作,反之亦然。 当您在SynchronousQueue上调用put()方法时,它将阻塞,直到有另一个线程将该元素从Queue…

OnSen UI结合AngularJs打造”美团APP我的”页面 --Hybrid App

1、页面效果图&#xff1a; 演示地址&#xff1a;http://www.nxl123.cn/bokeyuan/meiTuanDemo_mine/ 2、核心代码 mine.html&#xff1a; <ons-page id"mine" ng-controller"MineController"> <!--toolbar开始--> <ons-toolbar>…

[MOSS开发]:通过简单BUG跟踪Demo阐述用户控件对列表的操作

下面的文章我想以一个具体的BUG跟踪Demo来说明MOSS的具体应用,这里面会应用到下面的知识点: 1:用户组,用户的创建,权限分配&#xff1b; 2:列表的概念以及创建&#xff1b; 3:利用用户控件来完成表单的增加加功能&#xff1b; 4:当前域用户查看自己BUG。 BUG跟踪软件在一些…

Maven的课堂笔记4

9.Maven与MyEclipse2014结合 MyEclipse10以上的版本,对Maven支持的就比较好 9.2 Myeclipse配置 本地文件夹的C盘的.m2文件夹下必须得有这个settings.xml文件 不配置这个settings.xml文件的话,myeclipse会从互联网上下载需要的jar包. 9.3 修改pom文件 添加jar包 <project xml…

vue动画

vue 提供了一些显示、隐藏一些不同的过渡&#xff0c;效果主要跟 v-if v-show 动态组件 1. vue 给动画分了 6 个过程&#xff0c;在 css 中扮演 6 个类 .v-enter  定义动画的开始状态 .v-enter-active  定义动画生效时的状态 .v-enter-to  定义动画结束是的状态 .v-leave…

图数据库的知识表示与推理

图形数据库及其技术生态系统可以为知识表示和推理问题提供优雅&#xff0c;有效的解决方案。 要了解这种说法&#xff0c;我们必须首先了解什么是图形。 图是一种数据结构。 图数据结构的类型很多&#xff0c;但出于本文的目的&#xff0c;我们将重点介绍一种已被称为属性图的类…

vegas 为盖斯

vegas 为盖斯 S键 分割素材U键 分开视频和音频I键渲染开始O渲染结束 默认布局 为盖斯新建项目的参数 剪好后渲染 插入字幕 转载于:https://www.cnblogs.com/GaoNa/p/10562504.html

COMET彗星(三)构建自己的COMET核心

主题列表&#xff1a; COMET彗星&#xff08;一&#xff09;SERVER PUSH介绍 COMET彗星&#xff08;二&#xff09;基于SERVER PUSH的消息传输 引言&#xff1a; 在上一篇随笔中&#xff0c;对COMET使用的类和作用进行了简短的介绍&#xff0c;从本篇随笔开始&#xff0c;将从实…

如何在JavaServer Pages中使用Salesforce REST API

摘要&#xff1a;本教程提供了一个JSP示例以及如何将其与Salesforce REST API集成。 我们将逐步完成创建外部客户端以使用Force.com &#xff08;同时使用HTTP&#xff08;S&#xff09;和JSON&#xff09;管理您的数据的分步过程。 在此示例中&#xff0c;我将Mac OS X 10.9.…

写在08年“愚人节”

从博客园学了很多东西&#xff0c;是时候该回馈了。谢谢博客园给我们提供这么好的平台交流技术。 刚发了文章习惯性的看了下自己博客的首页代码&#xff0c;感觉日历不够精良。 我做过的一个ajax日历&#xff0c;可以参考解放日报 艺术家具版的日期直达功能的日历&#xff0c;用…

JQuery实现点击按钮切换图片(附源码)--JQuery基础

JQuery实现切换图片相对比较简单&#xff0c;直接贴代码了哈&#xff0c;有注释噢&#xff01;疑问请追加评论哈&#xff0c;不足之处还请大佬们指出&#xff01; 1、案例代码&#xff1a; demo.html&#xff1a; <!DOCTYPE html><html><head>   <me…

CSS3盒子模型

web前端必须了解的CSS3盒子模型 1、需要了解的属性以及属性值 display:box或者display:inline-box box-orient:horizontal | vertical (水平 垂直) 定义盒模型的布局方向 box-direction:normal reverse(正序 反序) 元素排列顺序 box-ordinal-group:number(数值) 设置元素…

与JBoss Fuse,Jenkins和Nexus的持续集成

最近&#xff0c;我正在整理一个快速启动的Maven项目&#xff0c;以展示一种组织JBoss Fuse项目的可行方法。 该项目可在Github上找到&#xff1a; https &#xff1a; //github.com/paoloantinori/fuse_ci 这是我与朋友詹姆斯罗林斯 &#xff08; James Rawlings&#xff09…

html5表单与PHP交互

1、示例代码 前端&#xff1a; <!DOCTYPE html><html><head><meta charset"utf-8"> <title>html5表单与PHP交互</title></head><body><form action"http://localhost/jh.php" method"post"…

【DP】【期望】$P1850$换教室

【DP】【期望】\(P1850\)换教室 链接 题目描述 有 \(2n\) 节课程安排在$ n$ 个时间段上。在第 \(i\)&#xff08;\(1 \leq i \leq n\)&#xff09;个时间段上&#xff0c;两节内容相同的课程同时在不同的地点进行&#xff0c;其中&#xff0c;牛牛预先被安排在教室 \(c_i\)上课…

高并发服务器逻辑处理瓶颈,如何解决?

https://mp.weixin.qq.com/s/GHHHvgURdZpNJ1Ec6RHgPg 高并发衡量指标 响应时间&#xff1a;系统对请求做出响应的时间&#xff0c;即一个http请求返回所用的时间&#xff1b;吞吐量&#xff1a;单位时间内处理的请求数量&#xff1b;QPS&#xff08;TPS&#xff09;&#xff1a…

Java 8 StampedLocks与ReadWriteLocks和同步

同步部分就像访问您的岳父母。 您希望尽可能少出现。 关于锁定&#xff0c;规则是相同的–您想花费最短的时间在关键区域内获取锁定&#xff0c;以防止形成瓶颈。 锁定的核心语言惯用法一直是用于方法和离散块的synced关键字。 这个关键字实际上已硬连接到HotSpot JVM中。 我们…

MSN on 2/16/2009

转载于:https://www.cnblogs.com/zxlin25/archive/2009/02/16/1391207.html

开发微信小程序中SSL协议的申请、证书绑定、TLS 版本处理等

在上篇随笔《基于微信小程序的系统开发准备工作》介绍了开发微信小程序的一些前期的架构设计、技术路线 、工具准备等方面内容&#xff0c;本篇随笔继续这个步骤&#xff0c;逐步介绍我们实际开发过程中对SSL协议的申请及后期处理过程&#xff0c;包括证书的IIS端口绑定&#x…