【问题标题】:Android Hashtable SerializationAndroid Hashtable 序列化
【发布时间】:2010-04-13 17:21:26
【问题描述】:

我在 Hashtable 的序列化方面遇到了一个奇怪的问题。我制作了一个服务器、客户端应用程序。服务器(PC / MAC)正在序列化哈希表并通过UDP将其发送到客户端(Android)。数据已正确发送/读取,但我在 LogCat 上收到一堆这些消息。

04-12 11:19:43.059: DEBUG/dalvikvm(407): GetFieldID: 找不到字段 Ljava/util/Hashtable;.loadFactor:F

偶尔会看到这些

04-12 11:21:19.150: DEBUG/dalvikvm(407): GC 在 97 毫秒内释放了 10814 个对象 / 447184 个字节

应用会运行 2-3 分钟,然后崩溃。有趣的是,我在 SDK 1.5 上看不到 Loadfactor 错误。但我确实看到了 GC Free xxxx 对象,经常安静。

调试后我发现问题在于反序列化,错误/警告来自以下代码

代码:

ByteArrayInputStream bis = new ByteArrayInputStream(bytes);           
ObjectInputStream ois = new ObjectInputStream(bis);             
object = ois.readObject(); 

在 代码:

object = ois.readObject();

在客户端。我的服务器正在序列化代码如下。

代码:

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(bos);               
oos.writeObject(obj);       

知道发生了什么吗?

感谢您的帮助!

【问题讨论】:

    标签: java android serialization hashtable


    【解决方案1】:

    不要在架构之间使用序列化。无法保证序列化的 Dalvik VM 对象树的格式与 JavaSE/JavaEE 环境兼容。请使用 XML、JSON、Protocol Buffers、Thrift 等在架构之间传输结构化数据。

    【讨论】:

      【解决方案2】:

      太晚了,但对于遇到这种情况的其他人来说:

      注意上面所说的 commonsware (不要说你没有被警告):

      我通过使用trove libraries 克服了这个问题 并使用长对象图。 我意识到,如果 dalvik 或 Java 改变了我被塞满的序列化,但序列化比替代方案容易得多,而且错误消息(虽然是良性的)确实意味着很多不必要的分配和开销。 最重要的是,我使用 proguard 将库减少到我需要的 45K(大约 1M)。 我还建议您保留一份 trove 源代码的副本,以防它们更改序列化,并注意我需要 3.0.0 rc1 才能使其工作(不确定版本之间的序列号是否必须匹配)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-22
        • 1970-01-01
        • 2012-09-07
        • 2023-04-06
        • 1970-01-01
        • 2011-02-01
        • 2011-08-26
        相关资源
        最近更新 更多