【发布时间】:2014-10-15 02:51:26
【问题描述】:
我有以下场景:
Interface A{
}
Class X implements A, Serializable{
}
程序 P1 知道 A 和 X,并将类 X 的对象 objX 序列化为字节数组 byAX。
然后,P1 通过中间件向程序 P2 发送byAX。
P2 只知道接口A。所以它将byAX反序列化为A类型的对象。问题是这个操作返回NULL。
P1中的序列化是这样实现的:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;
try {
out = new ObjectOutputStream(bos);
out.writeObject(objX);
byte[] byAX = bos.toByteArray();
...
P2中的反序列化是这样实现的:
ByteArrayInputStream bis = new ByteArrayInputStream(byAX);
ObjectInput in = new ObjectInputStream(bis);
A objA = (A) in.readObject();
对象objA 在A objA = (A) in.readObject(); 行之后得到NULL
我不能反序列化为接口类型吗?
我的错误在哪里?
非常感谢,
吉尔赫姆
【问题讨论】:
-
根据您的定义,
A不是Serializable的扩展。它还需要一个具体的类类型来反序列化。你不能直接实例化一个接口。 -
如果程序没有相应的类定义,您如何期望程序将内部状态转储转换为对象?
-
为了补充 Chris 的回复,我很确定您只能反序列化为与序列化相同的类定义。它应该具有相同的成员和方法。方法代码不必匹配,一些变化可以自动处理,比如向类添加新字段。
标签: java serialization interface bytearray deserialization