2011-06-21 73 views
0

我在Android项目中有一个Packet类(com.lab.tracking.Packet)。我需要通过UDP将这个数据包发送到一个服务器,它具有该数据包类的完全副本(com.server.serverTracking.Packet)。将字节流转换为对象

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

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,或其他)中。

谢谢!

+0

为什么你有两个完全相同的类,但在不同的包中?没有办法将一个“转换”到另一个。您应该重构代码,以便客户端和服务器共享一个通用的Packet类。 – wolfcastle

回答

1

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

所以解决的办法是摆脱com.server.serverTracking.Packet并将com.lab.tracking.Packet移动到一个公共库,android应用程序和服务器端代码依赖。

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

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

0

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