3

基本上我有一个DataContract包含一个Dictionary

[DataContract]
public class MyDictionary : IDictionary<string, object> {
    [DataMember(Name = "Data")]
    protected IDictionary<string, object> Dictionary { get; private set; }

    // ...
}

这是 XML 输出的相关部分:

<Data>
 <a:KeyValueOfstringanyType>
  <a:Key>ID</a:Key>
  <a:Value i:type="s:int">2</a:Value>
 </a:KeyValueOfstringanyType>
 <a:KeyValueOfstringanyType>
  <a:Key>Value</a:Key>
  <a:Value i:type="s:int">4711</a:Value>
 </a:KeyValueOfstringanyType>
</Data>

如何在此处将输出简化为以下内容:

<Data>
  <ID i:type="s:int">2</ID>
  <Value i:type="s:int">4711</Value>
</Data>

Dictionary 键仅限于字符串,因此如果没有人想到使用应该可以正常工作的非 ascii 键的愚蠢想法。我发现这个属性CollectionDataContract更接近我想要的,但是键值对将被完整保存,这会浪费内存。也许可以与班级相处融洽,ISerializable但我不确定这是否会给DataContractSerializer. 顺便说一句,该解决方案也应该适用于DataContractJsonSerializer.

4

1 回答 1

1

您遇到的问题来自 IDictionary<'string, object> 是(在某种程度上)IEnumerable<'KeyValuePair<'string, object>>,这就是 DataContractSerializer 序列化每个 KeyValuePair 个性的方式。

您要问的(如果我理解正确的话)是创建自定义序列化,为此您可以实现IXmlSerializable接口。

使用 WriteXml 和 ReadXml 函数来控制写入流的 xml,并将 XmlWriter 作为参数传递。

例如这个函数

public void WriteXml(XmlWriter writer)
    {
        foreach (var pair in _dictionary)
        {
            writer.WriteElementString("Key", pair.Key);
            writer.WriteElementString("Value", pair.Value.ToString());
        }
    }

会产生这个结果

<MyDictionary xmlns="http://schemas.datacontract.org/2004/07/Sandbox">
    <Key>ID</Key>
    <Value>15</Value>
    <Key>Value</Key>
    <Value>123</Value>
</MyDictionary>

假设已将两对输入到字典中(ID,15 和值,123)。

哦,关于 JSON,有一个IJsonSerializable但我从来没有开始使用它。

于 2013-05-11T16:19:15.870 回答