【问题标题】:MessagePack Serializing object error on AndroidAndroid上的MessagePack序列化对象错误
【发布时间】:2012-10-17 02:06:33
【问题描述】:

在android上使用messagepack,可以序列化/反序列化一个类,但不是绝对正确 .

简单的测试类:

    @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);”之后在 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

我有评论Using MessagePack with Android

【问题讨论】:

    标签: android msgpack messagepack


    【解决方案1】:

    MessagePack 本质上不是一个对象序列化器。它旨在序列化定义良好的数据结构。在 Java 中,对象的字段之间没有顺序的概念。这些 MessagePack 实现可能会引入一个,以便它们可以序列化和反序列化对象,但不能保证它在不同的机器上是相同的。

    如果你解压你的字节数组,下面是它们实际包含的内容:

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

    如果您想以可移植的方式序列化对象,请编写具有明确定义的成员顺序的特定序列化方法,或者使用与对象更接近的映射类型。

    请注意,这是此处报告的错误:http://jira.msgpack.org/browse/MSGPACK-51

    【讨论】:

    【解决方案2】:

    从MessagePack-Java v0.6.7开始,正式支持Android。

    它于 2012 年 12 月 9 日发布。请升级您的 msgpack 库。

    【讨论】:

    • 我正在使用 MessagePack-Java v0.6.11,我在 android 和我的 mac osx 计算机上得到不同的结果。有什么线索吗?
    猜你喜欢
    • 2014-07-22
    • 2014-04-30
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多