将字节流转换为Object

时间:2011-06-21 16:42:40

标签: java android serialization object

我在Android项目中有一个Packet类(com.lab.tracking.Packet)。我需要通过UDP将此数据包发送到服务器,该服务器具有该Packet类的完全副本(com.server.serverTracking.Packet)。

Android应用程序将数据包转换为字节流,然后将其发送到服务器。服务器正确接收字节流,但是当它尝试将其转换为数据包时,它会引发异常:

java.lang.ClassNotFoundException: com.lab.tracking.Packet

我理解。服务器正在尝试将此对象转换为com.lab.tracking.Packet,而不是com.server.serverTracking.Packet)。

从字节流到Object的转换是:

    public static Object toObject(byte[] dataReceived) {
    Object obj = null;
    try {
        ByteArrayInputStream bis = new ByteArrayInputStream(dataReceived);
        ObjectInputStream ois = new ObjectInputStream(bis);
        obj = ois.readObject();
    } catch (IOException ex) {
        ex.printStackTrace();
    } catch (ClassNotFoundException ex) {   
        ex.printStackTrace();
    }
    return obj;
}

我怎么能避免这个?这两个类完全相同,所以我认为问题在于完整的名称(或ID,或其他)。

谢谢!

2 个答案:

答案 0 :(得分:1)

要扩展djg的答案,问题是你的Packet类不是“完全相同”,因为它们位于不同的包中。

因此,解决方案是摆脱com.server.serverTracking.Packet并将com.lab.tracking.Packet移动到Android应用程序和服务器端代码所依赖的公共库。

话虽如此,我建议不要在Android应用程序和服务器之间使用Java对象序列化。如果您的Packet以新版本发生任何重大变化(新成员变量等),您可能会破坏所有以前的版本。至少,您应该明确指定serialVersionUid。

更好的解决方案是为数据包字节数组设计一个结构,并使用工厂类或构造函数将字节数组解析为Java对象。

答案 1 :(得分:0)

将数据包实现放在android项目和服务器都依赖的核心库中。