42

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

4

7 回答 7

78

statics 是隐式的transient,所以你不需要这样声明它们。

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

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

于 2011-06-21T17:33:38.363 回答
10

简短的规则如下:

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

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

3. 类名 和serialVersionUID都序列化为字节流,反序列化时serialVersionUID,从源读取,与本地类相同static变量进行比较。这就是为什么serialVersionUID声明为static public final不需要创建进一步的对象来比较这些 versionUID(s)。

  • 如果发现任何差异,则会发生InvalidClassException
于 2016-07-21T06:49:41.230 回答
3

static序列化忽略字段。

更新为说static而不是transient像我最初打算的那样......

于 2011-06-21T17:32:58.133 回答
1

static字段未序列化。

于 2011-06-21T17:34:11.717 回答
0

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

于 2011-06-21T17:35:17.203 回答
0

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

于 2018-09-02T09:38:22.617 回答
0

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

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

于 2021-07-07T04:45:35.537 回答