【问题标题】:Converting a byte stream to an Object将字节流转换为对象
【发布时间】:2011-09-19 17:04:45
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

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

标签: java android serialization object


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2019-08-12
      相关资源
      最近更新 更多