Ошибка сериализации объекта MessagePack на Android
Используйте пакет сообщений на андроиде, можете сериализовать / десериализовать класс, но не совсем верно.
простой тестовый класс:
@Message
public class Account {
public String Code;
public int Sequence;
public float Lot;
public String toString(){
return "Seq:"+Sequence;
}
}
Тестовый код :
MessagePack msgpack = new MessagePack();
msgpack.register(Account.class);
try {
Account a = new Account();
a.Code ="name";
a.Sequence = 105;
a.Lot = (float)1.05;
byte[] b = msgpack.write(a);
//byte[] c = MessagePack.pack(a);
Account aa = msgpack.read(b, Account.class );
System.out.println(new String(b));
System.out.println("test00: aa.Lot "+aa.Lot);
}catch(IOException e){
e.printStackTrace();
}
после запуска "byte[] b = msgpack.write(a);" на андроиде выходной байтовый массив b[] неверен (сравните с java)
[-109, -92, 110, 97, 109, 101, 105, -54, 63, -122, 102, 102] on java
[-109, -92, 110, 97, 109, 101, -54, 63, -122, 102, 102, 105] on android
У меня есть обзор Использование MessagePack с Android
2 ответа
MessagePack, по сути, не является сериализатором объектов. Он предназначен для сериализации четко определенных структур данных. В Java нет понятия порядка между полями объекта. Эти реализации MessagePack, вероятно, вводят один, чтобы они могли сериализовать и десериализовать объекты, но не гарантируется, что он будет одинаковым на разных машинах.
Если вы распакуете свои байтовые массивы, вот что они на самом деле содержат:
["name", 105, 1.05] on Java
["name", 1.05, 105] on Android
Если вы хотите сериализовать объект переносимым способом, напишите конкретный метод сериализации с четко определенным порядком для членов или используйте тип карты, который больше соответствует объекту.
Обратите внимание, что это сообщенная ошибка здесь: http://jira.msgpack.org/browse/MSGPACK-51
Начиная с версии MessagePack-Java v0.6.7, он официально поддерживает Android.
Он выпущен 09 декабря 2012 года. Пожалуйста, обновите вашу библиотеку msgpack.