【问题标题】:Deserialization to an interface type returns null对接口类型的反序列化返回 null
【发布时间】:2014-10-15 02:51:26
【问题描述】:

我有以下场景:

Interface A{
}

Class X implements A, Serializable{
}

程序 P1 知道 AX,并将类 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();

对象objAA objA = (A) in.readObject(); 行之后得到NULL

我不能反序列化为接口类型吗?

我的错误在哪里?

非常感谢,

吉尔赫姆

【问题讨论】:

  • 根据您的定义,A 不是Serializable 的扩展。它还需要一个具体的类类型来反序列化。你不能直接实例化一个接口。
  • 如果程序没有相应的类定义,您如何期望程序将内部状态转储转换为对象?
  • 为了补充 Chris 的回复,我很确定您只能反序列化为与序列化相同的类定义。它应该具有相同的成员和方法。方法代码不必匹配,一些变化可以自动处理,比如向类添加新字段。

标签: java serialization interface bytearray deserialization


【解决方案1】:

如果 readObject() 返回 null,则您将 null 传递给 writeObject()

真正的原因可能是readObject() 抛出了一个异常,而您的代码忽略了该异常并返回了null。在这种情况下,您需要调试异常。不要忽视它。

【讨论】:

    猜你喜欢
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多