gpt4 book ai didi

Java:不变性和序列化

转载 作者:搜寻专家 更新时间:2023-10-31 19:49:25 25 4
gpt4 key购买 nike

当我有一个非最终的不可变父类 A,而另一个类 B 扩展了它(B 是可变的)时,A 的不可变性是否会因为序列化而受到影响?

我写了一个小程序来序列化一个对象,在程序中改变它的状态,然后反序列化它。我以序列化的形式取回了对象。所以我想知道有什么方法可以通过序列化来改变 A 的不变性吗?

最佳答案

这完全取决于您的要求。如果您只是想获得与您输入的值不同的值,那么是的,您可以通过序列化来实现。序列化数据与内存中存在的 A 实例完全分离。当 Java 从序列化数据重建对象时,它不知道也不关心用于创建该数据的 A 的原始实例。它只是根据序列化信息中提供的蓝图在内存中构建数据结构。

因此,如果您想修改在重构 A 时返回的内容,您可以通过手动修改二进制序列化数据来实现。这样做需要对 Java 的序列化格式有很好的理解,但这当然可以做到。

虽然如果您问是否有任何方法可以通过序列化修改 A 的原始实例(例如,以某种方式让相同的对象改变值,而不通过构造新实例反序列化),那么答案是否定的,你不能。序列化只是创建对象当前状态的快照。反序列化创建一个与源实例完全分离的新对象实例。因此,虽然您可以手动更改值,但具有新值的新对象在反序列化后仍然是不可变的。

如果您问是否有办法序列化不可变类 A 的实例,然后将数据反序列化为标识为类 A 的实例,但是恰好是可变的那么答案也是否定的。序列化数据指定表示的对象类,但类定义本身未序列化。因此,您可以更改指定的类,以便序列化 A 的实例,然后反序列化可变类 B 的实例,但这与取回可变实例不同A

关于Java:不变性和序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6592312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com