gpt4 book ai didi

Java 序列化与继承

转载 作者:行者123 更新时间:2023-12-01 15:17:53 24 4
gpt4 key购买 nike

问题:A 类实现了可序列化B 类扩展 A 实现可序列化

现在我仅使用类 B 作为运行时类型进行序列化。所以我有一个 list :

List<A> lst = new ArrayList<A>();
lst.add(new B());
...
objectOutputStream.writeObject(lst.get(i)); //this write compiler-type A, runtime-type B

如果我现在反序列化它,我会收到 java.io.OptionalDataException 错误。无论如何,我想知道的是我的对象如何成为正确的运行时类型。反序列化:

A a = (A) objectInputStream.readObject();

如果 B 类在序列化时是一个运行时类型,这是否会导致 B 类的运行时类型,或者我是否必须覆盖A 的每个子类的默认序列化?

希望我没有错过任何明显的事情。

提前致谢:)

编辑:

感谢所有的答案,它们确实帮助我理解了自己的错误。

抛出异常是因为我(如回答)使用了 in.read(arr);这导致无法完全读取数据,因此无法正确反序列化对象(当然不是) - 将其更改为 readFully 后,它按预期工作。

最佳答案

根据给定的信息,我无法确定您为何收到OptionalDataException。 A 是可序列化的,因此当 B 扩展 A 时,B 将可序列化。假设 list.get(i) 是对象 B,则 objectOutputStream.writeObject(list.get(i)) 会将对象 B 写入流。当你读回来时,它会返回对象 B。

类型删除的参数是无关紧要的,因为方法 ObjectOutputStream.writeObject 接受 Object 作为参数。

您是否为 A 类或 B 类定义了私有(private)方法 writeObject 和 readObject?如果您定义这些方法,请确保它们以正确的顺序读写对象和原始数据。

关于Java 序列化与继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11379759/

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