2010-04-13 25 views
2

我對Hashtable的序列化有一個奇怪的問題。我製作了一個Server,Client應用程序。服務器(PC/MAC)序列化一個Hashtable並通過UDP發送給客戶端(Android)的地方。數據正確發送/讀取,但是我在LogCat中獲得了一大堆這些消息。Android Hashtable序列化

11月4日至12日:19:43.059:DEBUG/dalvikvm(407):GetFieldID:無法找到現場Ljava/util的/哈希表; .loadFactor:F

偶爾,我會看到這些

04-12 11:21:19.150:DEBUG/dalvikvm(407):GC已釋放10814個對象/ 447184字節在97ms內

該應用程序將運行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);  

任何想法是怎麼回事?

感謝您的幫助!

回答

1

不要在體系結構之間使用序列化。不能保證序列化的Dalvik VM對象樹將採用與JavaSE/JavaEE環境兼容的格式。請使用XML,JSON,Protocol Buffers,Thrift等在架構之間傳輸結構化數據。

0

來得太遲,但對於其他人誰遇到這樣的:

注意到什麼commonsware上面(不要說我沒警告你)說:

我得到了這個利用trove libraries 並使用長對象地圖。 我意識到,如果達爾維克或Java改變序列化我塞滿了,但序列化比替代方案容易得多,錯誤信息(雖然是良性的)確實意味着很多不必要的分配和開銷。 在此之上,我使用proguard將庫降低到我需要的45K(超出〜1M)。 我也建議你保留一份trove源代碼的副本,以防他們改變序列化,並且還要注意我需要3.0.0 rc1才能使其正常工作(不確定serialid是否必須匹配不同版本)。