0

问题:A类实现Serializable B类扩展A实现Serializable

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

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 类的运行时类型,还是我必须覆盖 A 的每个子类的默认序列化?

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

提前致谢 : )

编辑:

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

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

4

2 回答 2

1

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

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

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

于 2012-07-08T02:59:27.880 回答
0

好的..试试这个......

1.首先serializable是一个marker/tag接口,表示这个类的对象是允许序列化的,当一个Super类可序列化时,它的Sub类会自动序列化...所以不需要B将 A 扩展为可序列化。

2.现在当你说使用readObject() 读回对象时,它将是 Object 形式,这就是你需要将它转换为它的类型的原因。

例如:

GamePlayer gp1 = (GamePlayer) os.readObject(); //os is ObjectInputStream instance

于 2012-07-08T14:00:03.627 回答