3

androidでmessagepackを使用すると、クラスをシリアル化/逆シリアル化できますが、完全に正しいわけではありません。

簡単なテストクラス:

    @Message
public class Account {

    public String Code;
    public int Sequence;
    public float Lot;

    public String toString(){
        return "Seq:"+Sequence;
    }
}

テストコード:</ p>

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);" androidでは、出力バイト配列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

AndroidでMessagePackを使用するレビューがあります

4

2 に答える 2

1

MessagePackは、本質的に、オブジェクトシリアライザーではありません。これは、明確に定義されたデータ構造をシリアル化することを目的としています。Javaでは、オブジェクトのフィールド間に順序の概念はありません。これらのMessagePack実装は、オブジェクトをシリアル化および逆シリアル化できるように1つを導入している可能性がありますが、異なるマシンで同じになるとは限りません。

バイト配列を解凍すると、実際に含まれているものは次のようになります。

["name", 105, 1.05] on Java
["name", 1.05, 105] on Android

移植可能な方法でオブジェクトをシリアル化する場合は、メンバーの順序が明確に定義された特定のシリアル化メソッドを作成するか、オブジェクトにより密接に対応するマップタイプを使用します。

これはここで報告されたバグであることに注意してください:http://jira.msgpack.org/browse/MSGPACK-51

于 2012-10-17T08:48:00.097 に答える
0

MessagePack-Java v0.6.7から、Androidを正式にサポートします。

2012年12月9日にリリースされました。msgpackライブラリをアップグレードしてください。

于 2012-12-26T07:49:20.433 に答える