我正在尝试解析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
的默认设置,但是当PackageDictionary
是ONE THREE
TWO FOUR
时,它无法弄清楚应该使用相同的序列化程序实际的财产类型。有什么想法吗?