Android Hashtable Сериализация - PullRequest
       15

Android Hashtable Сериализация

2 голосов
/ 13 апреля 2010

У меня странная проблема с сериализацией Hashtable. Я сделал приложение сервера, клиента. Где сервер (ПК / MAC) сериализует Hashtable и отправляет его Клиенту (Android) через UDP. Данные отправляются / читаются правильно, но я получаю кучу этих сообщений ниже на 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): сборщик мусора освободил 10814 объектов / 447184 байта за 97 мс

Приложение будет работать в течение 2-3 минут, а затем вылетает. Интересно, что я не вижу ошибок Loadfactor на SDK 1.5. Но я вижу объекты 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);       

Есть идеи, что происходит?

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 13 апреля 2010

Не используйте сериализацию между архитектурами. Нет гарантии, что сериализованное дерево объектов Dalvik VM будет иметь формат, совместимый со средой JavaSE / JavaEE. Пожалуйста, используйте XML, JSON, Protocol Buffers, Thrift и т. Д. Для передачи структурированных данных между архитектурами.

0 голосов
/ 16 февраля 2011

Слишком поздно, но для всех, кто сталкивается с этим:

Отмечая сказанное выше comonsware (не говорите, что вас не предупреждали):

Я преодолел это с помощью trove library и используя длинные карты объектов. Я понимаю, что если dalvik или Java изменят сериализацию, я напичкан, но сериализация намного проще, чем альтернативы, и это сообщение об ошибке (хотя и доброкачественное) действительно означает много ненужных распределений и накладных расходов. Кроме того, я использую Proguard, чтобы уменьшить библиотеку до 45 КБ (из ~ 1 МБ), которая мне нужна. Я также хотел бы предложить вам сохранить копию исходного кода trove на случай, если они изменят свою сериализацию, а также заметить, что мне нужен 3.0.0 rc1, чтобы заставить его работать (не уверен, что serialid обязательно совпадает между версиями).

...