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