我在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项目和服务器都依赖的核心库中。