Java:不可变性和序列化

Vin*_*C M 5 java serialization immutability

当我有一个不可变的父类A不是最终的,而另一个类B扩展它(B是可变的)时,有没有什么方法可以因为序列化而影响A的不变性?

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

aro*_*oth 5

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

因此,如果要修改重建时获得的内容A,可以通过手动修改二进制序列化数据来实现.这样做需要很好地理解Java的序列化格式,但它当然可以完成.

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

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