在解包时,MsgPack-cli将IDictionary <tkey,tvalue =“”>的实现解释为Array

时间:2017-05-04 17:51:22

标签: c# .net msgpack

我正在尝试解析MessagePack消息。当我将所讨论的字段声明为Dictionary<string, Package>时,一切正常并且消息按预期解压缩。但是,当我将相关字段声明为自定义字典实现PackageDictionary时,MsgPack库会尝试将其反序列化为数组。我已将PackageDictionary定义为IDictionary<string, Package>。到底是怎么回事? MsgPack库不应该将所有IDictionary实现解释为字典而不是数组吗?我究竟做错了什么?我是否需要使用属性来标记该字段应该反序列化为字典?

以下是我正在尝试做的一个例子:

[DataContract]
public class PackagesMessage
{
    [DataMemeber]
    public PackageDictionary Packages { get; set; }
}

public class PackageDictionary : IDictionary<string, Package> { ... }

这是我收到一条错误消息,说“解包器不在位置的数组头中......”

如果相反,我将Packages类型切换为Dictionary,如下所示:

[DataContract]
public class PackagesMessage
{
    [DataMember]
    public Dictionary<string, Package>() Packages { get; set; }
}

一切正常,消息正确反序列化。有什么想法吗?

非常感谢任何帮助。

更新

我找到了一个解决方法,并不理想,但是如果我将属性更改为PackageDictionary,我可以将字段解析为IDictionary<string, Package>类型,然后为IDictionary<string, Package>设置默认集合序列化程序到PackageDictionary。目前这是有效的,因为所有IDictionary<string, Package>字段都应该被解释为PackageDictionary类型,但如果我需要更常见的IDictionary IDictionary<string, string>,我会发现这是个问题。如果依赖于字段,实现将需要不同。我很困惑如何设置序列化上下文以使用PackageDictionary序列化程序作为IDictionary的默认设置,但是当PackageDictionaryONE THREE TWO FOUR 时,它无法弄清楚应该使用相同的序列化程序实际的财产类型。有什么想法吗?

0 个答案:

没有答案