比较来自世界各地的卖家的域名和 IT 服务价格

为什么创造长期 serialVersionUID 而不是简单 1L?

当课程实施时 Serializable 在 Eclipse, 我有两个选择:添加 default
serialVersionUID/1L/

或生成
serialVersionUID/3567653491060394677L/

. 我认为第一个选择是陡峭的,但许多时候我已经看到了使用第二个选项的人。 有没有理由生成
long serialVersionUID

?
已邀请:

帅驴

赞同来自:

据我所能判断,它只会兼容以前的版本。 只有你忘了使用它就会有用 serialVersionUID 早些时候然后改变了,如你所知,应该是
http://java.sun.com/javase/6/d ... 36678
, 但这会导致序列化的分离。


http://java.sun.com/javase/6/d ... .html
更多细节。

君笑尘

赞同来自:

该版本序列化的目的 UID 正在跟踪类的各种版本,以执行对象的允许序列化。

这个想法是创造 ID, 这对于特定类版本是唯一的,然后将新零件添加到类(例如新字段)时更改,然后会影响序列化对象的结构。

始终使用它 ID, 例如
1L

, 这意味着在将来,如果更改了类的定义,这将导致序列化对象的结构中的变化,在尝试将对象进行反序列化时会有很高的问题概率。

如果一个 ID 省略 Java 实际计算 ID 对于基于对象字段,但我相信这是一个昂贵的过程,所以提供一个手动提高性能。

以下是与讨论序列化和验证的文章的一些链接:

http://java.sun.com/developer/ ... .html
当年

/链接打破了二月 2013

当年/

http://www.oracle.com/technetw ... .html

龙天

赞同来自:

生成的主要原因是使其与现有类版本兼容,该类已已已保存副本。

风见雨下

赞同来自:

价值 "long" 默认为
serialVersionUID

- 定义了此默认值
http://docs.oracle.com/javase/ ... .html
, 从默认的序列化行为计算。

因此,如果添加默认版本号,您的类将 /在哪里-/序列化速度更快,直到在结构上发生任何变化,但您必须在更改类字段时注意 /add/remove 您还更新了序列号。

如果您不需要与现有比特流兼容,则可以简单地放置
1L

在发生更改时,在那里增加版本。 也就是说,当修改类的序列化版本与旧类的默认版本不同时。

龙天

赞同来自:

你绝对必须创造 serialVersionUID 每次你定义
功能类
java.io.Serializable

. 如果你没有,一个意志
它将自动为您创建,但它很糟糕。 自动生成
serialVersionUID 基于您班级方法的签名,所以
如果将来更改您的课程以添加方法 /例如/,
欲望 "old" 类版本将以错误结束。 这就是它的
可能导致:

在不定义的情况下创建课程的第一个版本
serialVersionUID.

在恒定存储中序列化类实例; 在
serialVersionUID 自动为您生成。

更改类以添加新方法,然后重新部署应用程序。

尝试将在步骤中序列化的实例进行反序列化 2, 但现在他失败了 /当它应该成功/, 因为它有
各种自动生成 serialVersionUID.

快网

赞同来自:

如果您未指定 serialVersionUID, 那 Java 让他暂停。 生成 serialVersionUID - 这正是数字。 如果您在类中更改了某些内容,其实际上不会与上一个序列化版本的课程不兼容,但更改 hash, 然后你需要使用生成 very-large-number serialVersionUID /或数字 "expected" 来自错误消息/. 否则,如果你自己跟踪一切, 0, 1, 2... 更好的。

莫问

赞同来自:

当你使用时 serialVersionUID/1L/ 而不是一代 serialVersionUID/3567653491060394677L/, 你说了什么。

你说你 100% 我们相信没有触及此类的系统没有该类的不兼容的序列化版本,版本号 1.

如果你能想出任何借口,这样它的序列化版本是未知的,那么充满信心可能很难说。 在他的生命中,许多人都会支持成功的课程,生活在许多项目中,并在许多系统中。

你可以因为这个而受苦。 或者你可以玩彩票,希望失去。 如果您创建一个版本,则您有一个很小的机会,一切都出错了。 如果你假设 "Hey I bet no one used 1 yet" 你的机会不仅仅是微小的。 正是因为我们都认为这一点 0 1很酷,你有更高的机会进入它们。
-

当你生成时 serialVersionUID/3567653491060394677L/, 不使用 serialVersionUID/1L/, 你说了什么。

你说人们可以手动在这个类的整个历史记录中创建或生成其他版本的版本,而且你不在乎,因为长时间是该死的大数字。

无论如何,如果您与整个宇宙中的类序列化的版本号的历史记录完全不了解,则您曾存在或将存在,则风险。 如果您有时间确保100%是 AOK, 去吧。 如果这需要大量工作,请继续并盲目地生成一个数字。 你很快就会赢得彩票而不是你遗漏的错误。 如果发生这种情况,请告诉我,我会给你买啤酒。

通过所有关于彩票中的游戏的谈话,我可能会给你印象 serialVersionUID 它是随机生成的。 事实上,虽然数量的数字范围均匀分布,但它会很棒。 但是,事实上,这是这样做的:

http://docs.oracle.com/javase/ ... 34100
你唯一的区别是你不需要一个机会来源。 您在类本身中使用更改以更改结果。 但按照原则 pigeonhole 仍然有可能出现问题并导致碰撞。 它只是不太可能的。 祝你啤酒好运。

但是,即使课堂只能生活在一个系统和一个代码库中,也认为手动增加了数量的增加,这让您有零碰撞的机会,只意味着您不了解人才。 :/

郭文康

赞同来自:

嗯,SerialVersionUID是规则的例外 “static fields don’t get serialized”. ObjectOutputStream 每次值都写作 serialVersionUID 在输出流中。 ObjectInputStream 读取它,如果从流读取的值不同意该值的同意 serialVersionUID 在当前版本的类中,然后它抛出 InvalidClassException. 此外,如果在课堂上序列化,则没有正式宣布 serialVersionUID, 编译器自动将其添加到基于类中声明的字段生成的值。

二哥

赞同来自:

因为在许多情况下,默认标识符不是唯一的。 因此,我们创造 id 创建一个独特的概念。

三叔

赞同来自:

添加到答案 @David Schmitts, 通常,我总是使用标准 1L 来自协议。 我只需要回去改变几次一些,但是当我做了更改时,我知道它每次都将默认号码更新到一个时。

在我当前的公司中,他们需要一个自动生成的数字,所以我将它用于惯例,但我更喜欢默认值。 我相信,如果这不是您工作的协议,则使用默认值,除非您认为您将不断更改序列化课程的结构以某种原因。

郭文康

赞同来自:

该版本序列化的目的 UID 正在跟踪类的各种版本,以执行对象的允许序列化。

这个想法是创造 ID, 这对于特定版本的类是唯一的,然后将新的部分添加到类(例如新字段)时更改,例如将影响序列化对象的结构。

简单的解释:

序列化数据吗?

序列化基本上是数据录制类 file/stream/etc. 去序列化正在将此数据读回该类。

你要去生产吗?

如果你只是用不重要的测试/假数据,那么不要担心 /如果只有您直接测试序列化/.

这是第一个版本吗?

如果是,请安装 serialVersionUID=1L.

这是第二个,第三等版本 prod?

现在你需要担心 serialVersionUID, 你应该深入了解它。

原则上,如果在更新您需要的类时不正确更新版本 write/read,, 尝试阅读旧数据时,您将收到错误。

要回复问题请先登录注册