【问题标题】:C# / MsgPack.CLI: Order of deserializationC#/MsgPack.CLI:反序列化顺序
【发布时间】:2016-10-03 18:25:43
【问题描述】:

我正在尝试反序列化一个字节数组中的 MsgPack 数据包,如下所示:

47 52 209 0 144 209 0 144 72 86 54 195 209 66 73

我想把它放入这种类型的对象中:

public class Info
{
    public byte wX;
    public byte wY;
    public Int16 wMXCount;
    public Int16 wMYCount;
    public byte wMZCount;
    public byte wMRegionZ;
    public byte wZ;

    public bool m;
    public Int16 tkn;

}

我正在使用MsgPack.CLI 尝试反序列化它,如here 所示。

static public T Deserialize<T>(byte[] bytes)
{
    var serializer = MessagePackSerializer.Get<T>();
    using (var byteStream = new MemoryStream(bytes))
    {
        return serializer.Unpack(byteStream);
    }
}

然后运行它

Info mi2;
mi2 = Deserialize<Info>(bytes); //bytes is the byte array that contains the MsgPack

不幸的是,mi2 就像一个新创建的 Info,不包含来自 MsgPacket 的任何数据。如果有人知道如何让它发挥作用,那就太好了。

非常感谢!

更新

我制作了一个虚拟信息,并尝试模拟与上述数据类似的内容并自己对其进行序列化。我得到的首先是前面的 153(具有 9 个元素的固定数组的 id),这是有道理的,我忘记了,但元素的顺序也不同。

看来它们是按字母顺序排列的!有没有办法像在课堂上订购它们一样映射/反序列化它们,或者我是否必须将我的字段名称更改为 awX、bwY、cwMXCount ... 是否有一个标志以特定方式反序列化它们?

【问题讨论】:

  • 第一个问题写得很好。但与其编辑它以在其中包含答案,不如answer your own question。这样其他读者就可以快速得知问题已解决。
  • @dbc 谢谢。不知道回答您自己的问题是可能的,并且正在寻找“已解决”按钮。我现在已经提交了答案,我会尽快将其标记为解决方案

标签: c# serialization msgpack


【解决方案1】:

修好了!为了将来参考,这是如何: 显然没有排序标准,所以我不得不手动设置字段的顺序。这解决了我所有的问题:

public class Info
{
    [MessagePackMember(0)]
    public byte wX;
    [MessagePackMember(1)]
    public byte wY;
    [MessagePackMember(2)]
    public Int16 wMXCount;
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 2011-03-18
    相关资源
    最近更新 更多