我在序列化Hashtable时遇到了一个奇怪的问题。我已经做了一个服务器,客户端应用程序。其中服务器(PC/MAC)序列化Hashtable并通过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在97ms内释放了10814个对象/ 447184字节
应用程序会运行2-3分钟,然后崩溃。有趣的是,我在SDK1.5上没有看到Loadfactor错误。但是我确实看到了GC Free xxxx对象,很安静。
经过调试,我发现问题出在反序列化上,错误/警告来自以下代码
代码:
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
object = ois.readObject(); at Code:
object = ois.readObject();在客户端上。我的服务器正在序列化如下代码。
代码:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(obj); 知道这是怎么回事吗?
谢谢你的帮助!
发布于 2010-04-14 03:53:52
不要在体系结构之间使用序列化。不能保证序列化的Dalvik VM对象树的格式与JavaSE/JavaEE环境兼容。请使用XML、JSON、Protocol Buffers、Thrift等在架构之间传输结构化数据。
发布于 2011-02-16 19:03:47
为时已晚,但对于任何遇到这一点的人来说:
注意上面说的常用件(不要说你没有收到警告):
我通过使用trove libraries和长对象映射解决了这个问题。我意识到,如果dalvik或Java更改了序列化,我就完蛋了,但序列化比其他方法容易得多,而且错误消息(虽然是良性的)确实意味着大量不必要的分配和开销。最重要的是,我使用proguard将库减少到我需要的45K (满分1M)。我还建议您保留一份trove源代码的副本,以防他们更改序列化,还请注意,我需要3.0.0 rc1才能使其工作(不确定不同版本之间的序列号是否一定匹配)。
https://stackoverflow.com/questions/2631686
复制相似问题