Java 序列化与继承

标签 java inheritance serialization

问题: 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/

相关文章:

具有多线程的 Java Swing

java - 重新上传后 Filenet 文档属性未修改

C# 和 F# lambda 表达式代码生成

c# - .NET 中的方法是否也与数据成员一起序列化?

java - 使用 java 获取正在运行的应用程序列表,然后向其发送按键

java - Eclipse 与 BlueJ 问题

design-patterns - "inheritance is to be avoided"的想法从何而来?

java - JPA OneToMany 列表始终为空

java - 具有继承的重叠 Spring bean 名称

c# - 使用 XML 序列化时的循环引用?