Java静态序列化规则?
Posted
技术标签:
【中文标题】Java静态序列化规则?【英文标题】:Java static serialization rules? 【发布时间】:2011-09-19 17:51:04 【问题描述】:我正在使用一些静态方法和字段进行保存状态序列化。我可以发誓虽然序列化和静态造成了混乱。我应该使所有静态的瞬态?并且膨胀呼叫会恢复正常的静态吗?
【问题讨论】:
【参考方案1】:static
s 隐含为transient
,因此您不需要这样声明它们。
序列化是为了序列化实例,而不是类。 static
字段(方法无关紧要,因为它们是类定义的一部分,因此它们不会被序列化)将被重新初始化为加载类时设置的任何值。
如果您有一个可变的 static
字段,那么对该值所做的更改将会丢失。
【讨论】:
啊,我明白了,我不知道静态是固有瞬态的。那么,我将如何确保重新膨胀的实例仍然能够访问静态的? 静态变量在加载类时就存在,因为它们是类定义的一部分。 “静态默认是瞬态的”,这是否意味着有办法让它们不是瞬态的? 将措辞更改为“隐式瞬态”。如果您自定义序列化,您可以有效地使它们成为非瞬态的,但它不能“开箱即用”。【参考方案2】:短规则可以如下:
1。 static
变量在序列化期间不保存。相反,在反序列化过程中,static
变量是从类级别初始化开始的。
2。 static
和 transient
基于关键字的变量在序列化过程中都会被忽略。
3. 类名和serialVersionUID
都被序列化为字节流,当反序列化时,从源读取的serialVersionUID
与本地类相同的static
变量进行比较。这就是 serialVersionUID
被声明为 static public final
的原因,这样就无需再创建对象来比较这些 versionUID。
【讨论】:
【参考方案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序列化之排除被序列化字段(transient/静态变量)
Java序列化之排除被序列化字段(transient/静态变量)