将字节流转换为Object



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

安卓应用程序将数据包转换为字节流,然后将其发送到服务器。服务器正确接收字节流,但当它试图将其转换为数据包时,它会抛出一个异常:

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

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

从字节流到对象的转换是:

    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,或其他什么)上。

谢谢!

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

因此,解决方案是去掉com.server.serverTracking.Packet,将com.lab.tracking.Packet移动到android应用程序和服务器端代码都依赖的公共库中。

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

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

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

最新更新