问题:类A实现可序列化类B扩展A实现可序列化
现在我只使用类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类(如果它在序列化时是B类),或者我必须覆盖A的搜索子类的默认序列化吗?
希望我没有错过任何明显的东西。
提前感谢:)
编辑:
感谢所有的答案,他们真的帮助我理解了自己的错误。
异常被抛出是因为我(作为回答)使用了in.read(arr);,这导致不能完全读取数据,因此它不能正确地反序列化对象(当然不是)--在将它改为readFully之后,它按预期工作。
发布于 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?如果您定义了这些方法,请确保它们以正确的顺序读写对象和原始数据。
发布于 2012-07-08 22:00:04
Ok..try这个......
1.首先serializable是一个标记/标记接口,它说这个类的对象允许被序列化,和当一个超类是可序列化的时,它的子类将是自动可序列化的...so不需要使B扩展A成为可序列化的。
2.现在,当您说使用readObject()回读对象时,它将是对象形式,这就是您需要将其转换为其类型的原因。
例如:
GamePlayer gp1 = (GamePlayer) os.readObject(); //os is ObjectInputStream instance
https://stackoverflow.com/questions/11379759
复制相似问题