序列化和不可变对象

Poo*_*ool 17 java serialization final

我有一个用于不可变用途的类,因此我想标记所有字段final.

但是,该类被序列化和反序列化以通过网络发送.为此,需要一个空构造函数.这可以防止我创建最终字段.

我确信这是一个相当普遍的问题,但我找不到解决方案.我该怎么办?

Tom*_*ine 9

不需要no-arg构造函数.派生最多的非可序列化类确实需要一个no-arg构造函数可用于最少派生的可序列化类.

如果你需要改变a中的字段readObject,那么通过readResolve和使用串行代理writeReplace.


Yis*_*hai 7

在典型的序列化情况下,不要求类具有可构造的空构造函数或非最终字段.

现在,如果您必须进行自己的序列化,或者您需要子类化不实现Serializable的类,那么这是一个不同的故事.

因此,您需要提供有关如何解决问题的更多详细信息.


Ste*_*ker 5

这个问题是Java语言的一个漏洞.(请注意,这仅适用于您必须手动执行序列化,例如使用readObject)