问题标签 [serialversionuid]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
234 浏览

serialization - 序列化serialVersionUID问题

Clinet 运行在 JVM A 中,Server 运行在 JVM B 中。客户端到服务器的所有 EJB 调用。

现在我期望在客户端的 2 个对象中的任何一个。

  1. 数组LoanDocument

    或者

  2. BusinessServicesException

    /li>

现在BusinessServicesException扩展CommonExceptionCommonException扩展ProjectExceptionProjectException延伸Exception

我在所有 3 个异常类(客户端和服务器端)中指定了一个serialVersionUID值,1L以避免客户端的反序列化问题。

否则我会得到

因此,在所有 3 个类中提到 1L(serialVersionUID = 1L)解决了这个问题。

现在LoanDocument对象扩展CommonDocumentObject了,但没有一个具有serialVersionUID或实现Serializable接口。

但是当我们在客户端取得成功时,由于反序列化LoanDocument[],我没有得到任何相关的异常?serialVersionUID

我测试了几次,但我总是得到相同serialVersionUIDLoanDocument结果CommonDocumentObject.

我在 Server 和 Clinet 中使用了下面提到的代码,并且serialVersionUID双方总是相同的。

但在以下情况下总是不同的BusinessServicesException.

0 投票
1 回答
33 浏览

serialization - 版本控制和序列化

所以这是一个关于序列化和版本控制的问题。我有一个程序,它是一个音乐数据库,它存储带有名称、作曲家、...的乐谱。我将每首歌曲序列化到一个隐藏文件夹,以便用户可以在下次启动时重新加载数据库。

现在,当我必须更改 Song 类中的某些内容时,如果它是兼容的更改,一切都很好。我的想法是,如果要进行不兼容的更改,是否可以创建第二个具有相同名称“Song”但 VersionUID 不同的类。然后在读取 Songs 时,如果保存的版本与最新版本不匹配,它将转到将 Song 读入旧 UID 的方法,然后通过一系列步骤将其转换为新版本。这有可能吗?

我知道您可以拥有多个名称相同但参数不同的方法。这适用于类和 VersionUID 或其他一些变量吗?

谢谢!

0 投票
1 回答
919 浏览

java - 序列化的 lambda 并且没有 serialVersionUID?

我正在尝试了解序列化如何与 Java 及其最新版本一起使用。我正在尝试像这样序列化一个 lambda:

但我注意到我没有关于缺少serialVersionUID变量的警告。正常吗?

我知道它将在运行时生成,但强烈建议定义它:https ://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html

如果可序列化类没有显式声明 serialVersionUID,则序列化运行时将根据类的各个方面为该类计算默认的 serialVersionUID 值,如 Java(TM) 对象序列化规范中所述。但是,强烈建议所有可序列化的类都显式声明 serialVersionUID 值,因为默认的 serialVersionUID 计算对类细节高度敏感,这些细节可能因编译器实现而异,因此可能在反序列化期间导致意外的 InvalidClassExceptions。因此,为了保证在不同的 java 编译器实现中具有一致的 serialVersionUID 值,可序列化的类必须声明一个显式的 serialVersionUID 值。还强烈建议显式 serialVersionUID 声明尽可能使用 private 修饰符,因为此类声明仅适用于立即声明的类——serialVersionUID 字段不能用作继承成员。数组类不能显式声明 serialVersionUID,因此它们始终具有默认计算值,但数组类无需匹配 serialVersionUID 值。

我应该怎么办 ?如何在我的 Lambda 中定义它?

谢谢

0 投票
1 回答
6696 浏览

java - 1L 的 Java SerialVersionUid 可以吗?还是必须是独一无二的?

我有两个实现 Serializable 的 java 类。我将它们都设置为 1L 的 serialVersionUid。

一位同事说,所有类都必须有一个唯一的序列版本 uid,如果类具有相同的序列版本 uid,jvm 会将它们视为平等的。我认为相等是基于 equals 方法的结果,而不是串行版本的 uid。

据我了解,串行版本 uid 用于指示类的版本,并且当类以不兼容的方式更改时,串行版本 uid 应递增。

那是对的吗?可以使用 1 的 serialversion uid 吗?或者java类不应该有1L的serialversion uid?

0 投票
1 回答
3537 浏览

java - 为什么 Java 在 Exception 和 Throwable 类中声明 serialVersionUID?

当我创建一个自定义异常类时,如下所示

编译器给我下面的减弱

可序列化类 InsufficientBalanceException 未声明 long 类型的静态最终 serialVersionUID 字段

从Java doc我了解serialVersionUID的含义

序列化运行时将版本号与每个可序列化类相关联,称为 serialVersionUID,在反序列化期间使用该版本号来验证序列化对象的发送者和接收者是否已为该对象加载了与序列化兼容的类。如果接收者为对象加载了一个类,该对象的 serialVersionUID 与相应发送者的类不同,则反序列化将导致 InvalidClassException。可序列化的类可以通过声明一个名为“serialVersionUID”的字段来显式声明自己的serialVersionUID,该字段必须是静态的、最终的和long类型:

但是我不明白为什么Java在ExceptionThrowable类中声明serialVersionUID?ExceptionThrowable类中的 serialVersionUID 有什么用?真的需要吗?如果是,为什么?有人请澄清。

例外

可投掷的

0 投票
0 回答
315 浏览

java - serialVersionUID 最合适的访问修饰符是什么

精简版:

serialVersionUID 最合适的访问修饰符是什么?Eclipse 默认为私有,但将其设置为更可见的有什么问题吗?

背景:

我正在编写一个大量扩展 ArrayList 的库。如果我没有在序列化类中包含 serialVersionUID,我希望 Eclipse 发出警告。我还希望编译器在遇到没有 javadoc 注释的字段时发出警告。最后,我希望编辑器删除未使用的未使用字段。

所以为了实现这一点,我将我的类主体模板设置为此

serialVersionUID 的值只是我硬编码到模板中的任意选择的随机数。

该字段是公开的,以解决“未使用的变量问题”。

该字段有一个硬编码的注释来解决未注释字段的问题。

是的,我知道这很挑剔,但我是一个懒惰的完美主义者,不想每次都手动添加那个serialVersionUID并自己写评论。

可悲的是,我不能指定仅适用于序列化类的特定类型的类模板,也不能指定特定于字段 serialVersionUID 的模板,因此需要对其全部进行硬编码并设置为非私有以避免编译器抱怨关于在我清理源代码时缺少注释和编辑器删除未使用的值。

无论出于何种原因,我是否通过将 serialVersionUID 设置为私有以外的任何内容,在此类中引入了潜在的错误或漏洞?

0 投票
1 回答
354 浏览

java - 兼容的更改和serialversionUID

我需要关于兼容更改和 serialVersionUID ( http://docs.oracle.com/javase/6/docs/platform/serialization/spec/version.html#6678 ) 的建议。

我在一个带有“客户端”项目的系统上工作,该项目使用 RPC 与“服务器”项目通信(“服务器”使用 DTO 类从数据库导出数据,“客户端”使用相同的 DTO 类呈现该数据)。

当在 DTO 类中添加字段时,团队决定不更改 serialversionUID,因此当部署新版本的“服务器”时,不需要立即部署“客户端”,因为该 DTO 类的旧版本是与新的兼容。

但是(因为我们在两个项目中都有几十个系统实例),如果使用新版本的 DTO 类部署了新版本的“客户端”,并且“服务器”由于某种原因保留在旧版本中,那么新的字段的 DTO 类将解析为 null,并将作为 null 呈现给客户,这可能是不正确的。

有没有解决这个问题的最佳实践?我们可以在 DTO 类中进行任何类型的更改时更改 UID,但是我们将始终必须同时部署两个项目,即使没有使用更改,我们正在努力避免这种情况......

0 投票
0 回答
278 浏览

java - 数组类不能声明显式的 serialVersionUID

声明一个显式的 serialVersionUID 主要推荐用于序列化,但不推荐用于数组类,根据javadoc 的最后一行进行序列化

数组类不能显式声明 serialVersionUID,因此它们始终具有默认计算值,但数组类无需匹配 serialVersionUID 值。

javadoc 指的是哪些数组类?我只知道作为实用程序类的 Arrays 和最终的 Array。那么它还关心什么课程呢?

为什么数组类不能声明显式的 serialVersionUID ?

还有另一个帖子,但它没有解释不允许数组类声明serialVersionUID的原因

0 投票
1 回答
1665 浏览

java - 服务器和客户端类之间的序列版本 ID 不匹配问题

我正面临序列版本 ID 不匹配的问题。

我的服务器有 serialVersionID=20150301L 的代码;并且 myt 客户端代码有不同,因此手动更改它但仍然面临相同的问题。

错误:

我尝试了类似实现可序列化的选项,手动定义的serialVersionID与服务器相同,但每次都得到相同的错误。

0 投票
1 回答
2175 浏览

java - 如何修复同一个类中的serialVersionUID不等于异常?