Java静态序列化规则?

Posted

技术标签:

【中文标题】Java静态序列化规则?【英文标题】:Java static serialization rules? 【发布时间】:2011-09-19 17:51:04 【问题描述】:

我正在使用一些静态方法和字段进行保存状态序列化。我可以发誓虽然序列化和静态造成了混乱。我应该使所有静态的瞬态?并且膨胀呼叫会恢复正常的静态吗?

【问题讨论】:

【参考方案1】:

statics 隐含为transient,因此您不需要这样声明它们。

序列化是为了序列化实例,而不是static 字段(方法无关紧要,因为它们是类定义的一部分,因此它们不会被序列化)将被重新初始化为加载类时设置的任何值。

如果您有一个可变的 static 字段,那么对该值所做的更改将会丢失。

【讨论】:

啊,我明白了,我不知道静态是固有瞬态的。那么,我将如何确保重新膨胀的实例仍然能够访问静态的? 静态变量在加载类时就存在,因为它们是类定义的一部分。 “静态默认是瞬态的”,这是否意味着有办法让它们不是瞬态的? 将措辞更改为“隐式瞬态”。如果您自定义序列化,您可以有效地使它们成为非瞬态的,但它不能“开箱即用”。【参考方案2】:

短规则可以如下:

1。 static 变量在序列化期间不保存。相反,在反序列化过程中,static 变量是从类级别初始化开始的。

2。 statictransient 基于关键字的变量在序列化过程中都会被忽略。

3. 类名和serialVersionUID 都被序列化为字节流,当反序列化时,从源读取的serialVersionUID 与本地类相同的static 变量进行比较。这就是 serialVersionUID 被声明为 static public final 的原因,这样就无需再创建对象来比较这些 versionUID。

如果发现任何差异,则 InvalidClassException 会发生。

【讨论】:

【参考方案3】:

static 字段在序列化时被忽略。

更新为 static 而不是我原本打算的 transient...

【讨论】:

感谢您的回复,不过我知道。但是,当类从序列化过程中重新膨胀时,静态会返回吗? @Aedon:类的静态字段将继续是它们在对象被反序列化的 VM 中已经设置的任何内容。如果在反序列化对象时第一次初始化类,则静态字段将处于初始状态。 不解释就投反对票?不幸的是......好吧,正如 ColinD 重申的那样,静态在序列化时会被忽略(它们既不会写入序列化流,也不会从序列化流中读取)。 赞成毫无意义的反对票。答案完全正确。然而,OP 真正询问的是静态的,而不是瞬态的。 呃!我显然是想说“静态的”,即使投了反对票,我也看不出我自己的错误。感谢所有人 ;)。【参考方案4】:

static 字段未序列化。

【讨论】:

虽然静态字段 serialVersionUID 是序列化的 :) 我知道这是一篇相当老的帖子,但我认为添加它应该很好:) @Arunkumar Srisailapathi 我来寻找你评论的同一件事背后的原因。您能否帮助解释一下它是如何工作的,因为规范静态字段没有被序列化,serialVersionUID 是一个例外吗?【参考方案5】:

“当你序列化一个类的实例时,唯一保存的就是非静态和非瞬态的实例数据。类定义没有被保存。当你尝试反序列化一个对象时它们必须可用”@ 987654321@

【讨论】:

简短但非常混乱的答案。静态变量没有序列化。可序列化与它无关。 'default'在这里什么都没有,第二句话完全没有意义。 所以请用是或否回答我:1)静态变量是可序列化的吗? 2)静态变量绑定到实例,特定对象? (据我们所知,必须上课)......那么......这里到底出了什么问题? @Cris (1) 基本上没有意义。由于静态变量未序列化,因此不会出现它们是否可序列化的问题,但如果确实如此,它将完全取决于引用对象的实际类型。你的问题(2)完全没有意义。 静态变量是序列化的......应该是问题。非英语原生......我把序列化。 2)它有,因为在问题的上下文中,它是静态变量未序列化的原因...... @Cris 不,静态变量没有序列化。我不明白你在这里所说的以 2 开头的任何内容。【参考方案6】:

静态字段永远不能成为“ser”文件的一部分。静态+瞬态与瞬态相同。

【讨论】:

【参考方案7】:

静态属于类,灭菌处理对象/实例。

因此声明为静态的,它不再属于对象并且不能被序列化

【讨论】:

以上是关于Java静态序列化规则?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中序列化和反序列化中的静态成员问题

Java序列化之排除被序列化字段(transient/静态变量)

Java序列化之排除被序列化字段(transient/静态变量)

Java SonarQube规则squid:S1948 - 如何使用可序列化列表而不受绑定例如数组列表

Java:静态瞬态字段

静态内部类的序列化