Java静态序列化规则?

问题描述 投票:33回答:6

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

java serialization static transient
6个回答
60
投票

statics隐含transient,所以你不需要声明它们。

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

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


4
投票

简短规则如下:

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

2.序列化期间忽略基于statictransient关键字的变量。

3.类名和serialVersionUID都被序列化为字节流,当反序列化时,从源读取的serialVersionUID与本地类相同的static变量进行比较。这就是为什么serialVersionUID被声明为static public final,因此不需要创建更多的对象来比较这些版本的UID。

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

2
投票

序列化将忽略static字段。

更新说static而不是transient,因为我原本打算......


1
投票

static字段未序列化。


0
投票

“序列化类的实例时,唯一保存的是非静态和非瞬态实例数据。不保存类定义。当您尝试反序列化对象时,它们必须可用”http://java.sun.com/developer/technicalArticles/ALT/serialization/


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.