Ошибка сериализации объекта 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.

Другие вопросы по тегам