首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有继承的Java序列化

带有继承的Java序列化
EN

Stack Overflow用户
提问于 2012-07-08 08:25:49
回答 2查看 506关注 0票数 0

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

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

代码语言:javascript
复制
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错误。无论如何,我想知道的是,我的对象如何成为正确的运行时类型。反序列化:

代码语言:javascript
复制
A a = (A) objectInputStream.readObject();

这是否导致运行时类型为B类(如果它在序列化时是B类),或者我必须覆盖A的搜索子类的默认序列化吗?

希望我没有错过任何明显的东西。

提前感谢:)

编辑:

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

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

EN

回答 2

Stack Overflow用户

发布于 2012-07-08 10:59:28

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

erasure类型的参数是不相关的,因为方法ObjectOutputStream.writeObject接受Object作为参数。

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

票数 1
EN

Stack Overflow用户

发布于 2012-07-08 22:00:04

Ok..try这个......

1.首先serializable是一个标记/标记接口,它说这个类的对象允许被序列化,和当一个超类是可序列化的时,它的子类将是自动可序列化的...so不需要使B扩展A成为可序列化的。

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

例如:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11379759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档