有理由使用真正的serialVersionUID吗?

2024-01-02

这个问题与以下问题完全相同:

为什么生成长serialVersionUID而不是简单的1L? https://stackoverflow.com/questions/888335/why-generate-long-serialversionuid

具有讽刺意味的是,迈克尔·博格斯瓦特也回答了这个问题。


迈克尔·博格斯沃特 https://stackoverflow.com/questions/1373215/can-netbeans-generate-an-automatic-serial-version-id-for-a-java-class/1373293#1373293生成serialVersionUID的答案让我思考。是否有任何理由生成像 eclipse 和 IDEA 这样的正确的serialVersionUID(或者只是普通的serialver)?还是插上1L也一样好?


一旦你在其中写入了一个数字(任何数字),当你对类进行破坏兼容性的更改时,你就有责任修改它(例如,更改 JavaDoc 不会破坏它,添加属性肯定会破坏它)。

如果您避免指定serialVersionUID, javac会放一些独特的东西,比如类的哈希值。

什么时候重要?当您将内容序列化到磁盘并希望稍后使用不同版本的程序加载它时。 或者当两个可能具有不同版本的实例需要通过线路交换序列化数据时。

如果您不使用实际的序列化并且您的类是Serializable只是因为它继承了该接口,然后避免了serialVersionUID是最简单、最安全的事情。如果您进行序列化但实际上不需要与过去兼容,则同样,在这种情况下,避免该值是最安全的做法。

另一方面,如果您需要加载过去修订版生成的内容(无论是远程还是您自己,从磁盘上长期遗忘的文件中),那么您需要拥有该值,并在(并且仅当)您确实破坏了兼容性。

在第二条评论后添加(罗宾):

没有回答实际问题。

呃,对。我想这是一个:不,据我所知,实际数字没有任何意义,它只需要与以前的所有先前值不同,当它不再与它们兼容时。

另外,您应该始终为可序列化的类声明一个serialVersionUID

作为一般建议,我认为避免它是一个更好的解决方案:大多数时候你不需要与不同供应商的 JVM 进行交互,你不需要对很久以前的数据进行反序列化或者实际上需要兼容性检查,大多数时候序列化对象的生命周期非常短暂。

当然,对于不同的项目,当你do have长期存在的序列化对象,那么,您必须承担定义这些 UID 并正确维护它们的负担。

但是,由于缺少 UID 意味着“快速失败,捕获错误”,而使用 1L(或任何其他常量)通常意味着“类发生变化,你不记得更新它,稍后会出现问题”,那么作为一般建议,我认为第一个是更好的默认值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有理由使用真正的serialVersionUID吗? 的相关文章

  • 将 WAR 部署到 Tomcat(Spring Boot + Angular)

    我正在尝试使用以下命令部署 Spring Boot 应用程序WAR包装至Tomcat 10 应用程序已成功部署 但是 当我尝试访问端点时 它会导致404 未找到 战争文件 应用程序 war http localhost 8080 appli
  • java 拖放

    我尝试熟悉java中的拖放 但我发现的所有教程都是 让我生气 我想要的只是从 JList 包含在名为 UserPanel 的自制 JPanel 中 拖动 PublicUserLabel 并将其放入从 JTabbedPanel 继承的自制类中
  • 无法在 Intellij 中运行主类[重复]

    这个问题在这里已经有答案了 我有以下项目结构 ProjectRoot src Main examples libs My src文件夹被标记为sources在 Intellij 中 现在 当我想运行 Main 类时 出现以下错误 Excep
  • Jenkins 未显示 Maven 编译器错误

    在 Jenkins 中构建多模块 maven 3 项目时 如果出现构建错误 我们会收到一条神秘消息 表明 Maven 编译器插件失败 这在上周才刚刚开始发生 INFO BUILD FAILURE INFO INFO Total time 1
  • 清空变量不会使方法引用无效[重复]

    这个问题在这里已经有答案了 为什么代码不抛出NullPointerException当我使用与变量绑定的方法引用时dog我后来分配了null to 我正在使用 Java 8 import java util function Functio
  • 传递自定义类型查询参数

    如何接受自定义类型查询参数 public String detail QueryParam request final MYRequest request 上面的行在启动服务器时出现错误 jersey server model ModelV
  • 当前平台不支持桌面 API

    我遇到过这个错误 java lang UnsupportedOperationException 当前平台不支持桌面 API 我将从我的 java 应用程序中打开一个文件 我用这个方法 Desktop getDesktop open new
  • 如何使用 aether 从 Java 找到最新版本的 Maven 工件?

    他们的文档非常薄弱 我无法弄清楚 我找到了部分答案here https stackoverflow com questions 27428068 how to retrieve the latest also snapshot versio
  • 递归取消 allOf CompletableFuture

    如果我有 CompletableFuture
  • 如何检查单词是否在wordNet中

    我开始了解wordNet直到我知道我找到了synonymous对于一个特定的词 现在我有一个文件 我想使用标记化该文本n gram例如 String s I like to wear tee shirt 使用后n gram这将是 I lik
  • 我的 Kafka 流应用程序刚刚退出,代码为 0,什么也不做

    为了尝试 Kafka 流 我这样做了 public static void main String args final StreamsBuilder builder new StreamsBuilder final Properties
  • JFrame 在连续运行代码时冻结

    我在使用时遇到问题JFrame 它会冻结 连续运行代码 下面是我的代码 点击时btnRun 我调用了该函数MainLoop ActionListener btnRun Click new ActionListener Override pu
  • 如何在 JmsMessagingTemplate.sendAndReceive 上设置等待超时

    我在 MVC 控制器中使用 JmsMessagingTemplate 的 sendAndReceive 但如果没有发送回复消息 它似乎会永远等待回复 该文档指出 返回 回复 如果无法接收消息 例如由于超时 则可能为 null 然而 我只是不
  • 获取接收者的设备令牌以在 Firebase 中发送通知

    所以我正在学习如何使用 firebase 发送设备到设备的通知 我看到了这个answer https stackoverflow com a 42548586 5237289发送通知 看起来很简单 现在 我知道要获取发件人的令牌 它应该如下
  • 添加 char 和 int

    据我了解 字符是一个字符 即一个字母 一个digit 标点符号 制表符 空格或类似的东西 因此 当我这样做时 char c 1 System out println c 输出 1 正是我所期望的 那么为什么当我这样做时 int a 1 ch
  • 向Java类库添加函数

    我使用的 Java 类库在很多方面都不完整 有很多类我认为应该内置其他成员函数 但是 我不确定添加这些成员函数的最佳实践 让我们调用不足的基类A class A public A long arbitrary arguments publi
  • 线程数组?

    所以我在理解如何避免线程的顺序执行时遇到了问题 我试图创建一个线程数组并在单独的循环中执行 start 和 join 函数 这是我现在拥有的代码示例 private static int w static class wThreads im
  • 在 Tensorflow-lite Android 中将位图转换为 ByteBuffer(浮点)

    在用于图像分类的tensorflow lite android演示代码中 图像首先转换为ByteBuffer格式以获得更好的性能 这种从位图到浮点格式的转换以及随后到字节缓冲区的转换似乎是一个昂贵的操作 循环 按位运算符 float mem
  • 假布尔值=真?

    我在一本书中找到了这段代码 并在 Netbeans 中执行了它 boolean b false if b true System out println true else System out println false 我只是不明白为什
  • FetchType.LAZY 不适用于休眠中的 @ManyToOne 映射

    简而言之 我的 Child 类与 Parent 类之间存在多对一的关系 我想加载所有的孩子 而不必加载他们的父母详细信息 我的孩子班级是 Entity public class Child implements Serializable I

随机推荐

  • 如何隐藏图像按钮?

    我有 1 个 imageButton 我想在 oncreate 方法中 5 秒后隐藏该按钮 谁能帮帮我吗 onCreate new SleepTask execute private class SleepTask extends Asyn
  • 从 C# POCO 类代码生成 Winforms 表单

    是否已经在某处编写了一些开源代码 该代码将接受具有属性和验证属性的类 并输出带有与这些属性相对应的控件的 Windows 窗体 例子 public bool IsRed get set 产生一个带有Is Red label public i
  • Silverlight:如何设置验证工具提示的样式?

    我做了一些搜索 但这不是我要找的 那么 有谁知道如何在 Silverlight 中设置验证工具提示的样式 绿色边框中的东西 替代文本 http img689 imageshack us img689 222 validationtoolti
  • 获取CPU或主板序列号?

    我正在尝试获取CPU serial or motherboard serial using C or Python出于许可目的 是否可以 我在用着Linux 在 Linux 下 您可以使用 lshw quiet xml 并解析其输出 您将在
  • keras 和 tf.keras 模型之间的兼容性

    我有兴趣在 tf keras 中训练模型 然后用 keras 加载它 我知道这不是强烈建议 但我有兴趣使用 tf keras 来训练模型 因为 tf keras 更容易构建输入管道 我想利用 tf dataset API 我有兴趣用 ker
  • 为 Spring Boot 实现字节服务

    我想使用 Spring Boot Rest API 在 Angular 中实现视频播放器 我可以播放视频 但无法进行视频搜索 每次当我使用 Chrome 或 Edge 时 视频都会一遍又一遍地开始 我尝试了这个端点 RequestMappi
  • PHP PDO 获取 MySQL 日期时间

    我有一个代表 MySQL 表的 PHP 类 其中一种列表类型是DateTime 以前我使用字符串并且一切正常 因为我不必处理日期类型 我只是用fetchAll函数和列表自动映射到适当的字段 stmt gt execute results s
  • 使用 GAE Python 第二代在本地运行

    我已经使用 GAE P 第一代很多年了 现在正在跳转到我的第一个 GAE P 第二代项目 我正在尝试像我一样在本地运行它dev appserver py对于第一代应用程序 但是the docs https cloud google com
  • 在 OpenCV 上使用 SVM 训练图像

    我正在尝试对图像进行分类 下一步我将根据特征进行分类 但现在只想尝试我是否做得对 这是我的代码 include
  • AspectJ:自定义 *.aj 文件被忽略

    Why aspectj maven plugin忽略我的AnnotationInheritor aj文件 是我配置有问题吗 我想提建议ItemRepository getById带有自定义注释 Repository public inter
  • 从 Visual Studio 控制台运行解决方案,无需打开 IDE

    我在用视觉工作室2010 http en wikipedia org wiki Microsoft Visual Studio Visual Studio 2010 SP1 我首先尝试的是这样的 从开始菜单打开 Visual Studio
  • SQL OVERLAPS 运算符问题,如何解决

    我预计从 2011 01 28 到 2011 02 01 的日期期间与 2011 02 01 到 2011 02 01 的日期期间重叠 这里是同一天 但确实如此不是 PostgreSQL 期望精确结束点的匹配不是匹配 如何摆脱这个 我希望将
  • 如何使用加载的 SVG 模块

    我已经设置了 webpack 将 SVG 文件加载到 create react app 的 TSX 端口中 按照这个答案 https stackoverflow com a 44718847 1399272 const logo requi
  • CSS:悬停时背景从下到上填充:

    请看一下这个例子 https www outsideonline com 2317131 wilma rudolph worlds fastest woman https www outsideonline com 2317131 wilm
  • 嵌套片段在过渡动画期间消失

    场景如下 Activity 包含片段A 这又使用getChildFragmentManager 添加片段A1 and A2 in its onCreate像这样 getChildFragmentManager beginTransactio
  • ADO.NET 实体框架和 ASP.MVC 的组合是否有可能是错误的?

    我有一个包含三个项目的解决方案 DomainModel 带有 ADO NET 实体框架的 C 库 DomainModelTest 业务逻辑单元测试 Web 应用程序 使用域模型 由于某种原因 如果我传递 DomainModel 中的任何对象
  • 使用 OpenCV 识别 HSV 中颜色的范围

    我正在使用 Python 中的 OpenCV 来识别黄色 我已经到了这一步 我必须定义黄色的下限和上限范围HSV https en wikipedia org wiki HSL and HSV 定义蓝色范围的示例 lower blue np
  • 为什么 Set 不实现 PartialFunction?

    Scala 编程 综合分步指南 第二版 第 546 页 在 Iterable 下面的继承层次结构中 您会发现三个特征 Seq 设置和地图 这三个特征的一个共同点是它们都 通过 apply 和 isDefinedAt 实现 PartialFu
  • Ninject - 如何动态选择一个实现来绑定到接口

    我目前正在使用 Ninject 在 WCF 服务应用程序中创建接口实例 Bind
  • 有理由使用真正的serialVersionUID吗?

    这个问题与以下问题完全相同 为什么生成长serialVersionUID而不是简单的1L https stackoverflow com questions 888335 why generate long serialversionuid