我正在使用一些静态方法和字段进行保存状态序列化。我可以发誓虽然序列化和静态造成了混乱。我应该让所有静态瞬态?膨胀呼叫会恢复静态正常吗?
static
s隐含transient
,所以你不需要声明它们。
序列化用于序列化实例,而不是类。 static
字段(方法是无关紧要的,因为它们是类定义的一部分,所以它们没有被序列化)将被重新初始化为加载类时设置的任何值。
如果你有一个可变的static
字段,那么对该值的更改将会丢失。
简短规则如下:
1.序列化期间不保存static
变量。相反,在反序列化过程中,static
变量从类级初始化开始。
2.序列化期间忽略基于static
和transient
关键字的变量。
3.类名和serialVersionUID
都被序列化为字节流,当反序列化时,从源读取的serialVersionUID
与本地类相同的static
变量进行比较。这就是为什么serialVersionUID
被声明为static public final
,因此不需要创建更多的对象来比较这些版本的UID。
序列化将忽略static
字段。
更新说static
而不是transient
,因为我原本打算......
static
字段未序列化。
“序列化类的实例时,唯一保存的是非静态和非瞬态实例数据。不保存类定义。当您尝试反序列化对象时,它们必须可用”http://java.sun.com/developer/technicalArticles/ALT/serialization/
静态字段永远不能成为“ser”文件的一部分。静态+瞬态与瞬态相同。