Java静态序列化规则?

Java静态序列化规则?,java,serialization,static,transient,Java,Serialization,Static,Transient,我正在使用一些静态方法和字段进行保存状态序列化。我可以发誓,虽然序列化和静态造成了混乱。我应该让所有的静电都是瞬态的吗?并且膨胀调用是否会将静态恢复为正常状态?静态字段被忽略以进行序列化 更新为说静态,而不是我最初打算说的瞬态。静态是隐式的瞬态,因此您不需要这样声明它们 序列化用于序列化实例,而不是类静态字段(方法是不相关的,因为它们是类定义的一部分,所以不会序列化)将重新初始化为加载类时设置的任何值 如果您有一个可变的静态字段,则对该值所做的更改将丢失。静态字段不会序列化。“序列化类的实例时,

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

静态
字段被忽略以进行序列化


更新为说
静态
,而不是我最初打算说的
瞬态

静态
是隐式的
瞬态
,因此您不需要这样声明它们

序列化用于序列化实例,而不是类<代码>静态字段(方法是不相关的,因为它们是类定义的一部分,所以不会序列化)将重新初始化为加载类时设置的任何值


如果您有一个可变的
静态
字段,则对该值所做的更改将丢失。

静态
字段不会序列化。

“序列化类的实例时,只保存非静态和非瞬态实例数据。不保存类定义。当您尝试反序列化对象时,它们必须可用“

简短规则如下所示: 1.
static
变量在序列化过程中不保存。相反,在反序列化过程中,
static
变量从类级初始化启动。 2.
静态
瞬态
基于关键字的变量在序列化过程中都被忽略。 3.类名和
serialVersionUID
都被序列化为字节流,当反序列化时,从源代码读取的
serialVersionUID
将与本地类相同的
static
变量进行比较。这就是为什么
serialVersionUID
被声明为
static public final
,这样就没有进一步的obje需要创建ct以比较这些版本ID

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

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

感谢您的回复,但我知道。但是,当该类从序列化过程中重新展开时,静态是否会返回?@Aedon:该类的静态字段将继续是在反序列化对象的VM中已设置的字段。如果在反序列化对象时第一次初始化该类,静态字段将处于初始状态。是否在没有解释的情况下进行向下投票?不幸的。。。正如科林所重申的,静态被忽略用于序列化(它们既不写入序列化流,也不从序列化流读取)。答案完全正确。然而,OP实际上是在问静态的问题,而不是瞬态的问题。啊!我显然是想说“静态”,即使投了反对票,我也看不出自己的错误。谢谢大家;)。啊,我明白了,我不知道静力学是天生的瞬态。那么,我如何确保reienflated实例仍然能够访问静态变量呢?静态变量在类加载后就存在,因为它们是类定义的一部分。“静态默认是瞬态的”,这是否意味着有一种方法可以使它们不是瞬态的?将措辞更改为“隐式瞬态”。如果您自定义序列化,您可以有效地使它们非瞬态,但这不能“开箱即用”完成。简短但非常混乱的答案。静态变量未序列化。可序列化性与此无关。”“默认值”在这里没有任何意义,第二句话完全没有意义。因此,请用是或否回答我:1)静态变量是可序列化的?2) 静态变量是否绑定到和实例,特定对象?(据我们所知,他们一定要上课)…那么。。。这到底是怎么回事?@Cris(1)基本上毫无意义。由于静态变量未序列化,因此不会出现它们是否可序列化的问题,但如果可序列化,则完全取决于引用对象的实际类型。你的问题(2)是完全没有意义的。静态变量是序列化的…应该是问题所在。由于不是英语母语…我将其设置为可序列化。2) 这是因为在问题的上下文中,这是静态变量未序列化的原因。…@Cris不,静态变量未序列化。我不明白你在这里说的任何以2开头的内容。虽然静态字段serialVersionUID是序列化的:)我知道这是一篇相当老的文章,但我认为应该加上:)@Arunkumar Srisailapathi我是来寻找你评论的同一件事背后的原因的。您能解释一下它是如何工作的吗?因为按规范静态字段没有序列化,serialVersionUID是一个例外吗?