如何使用DataContractSerializer自定义字典序列化?

时间:2018-08-19 08:20:38

标签: c# xml serialization xml-serialization datacontractserializer

使用DataContractSerializer进行字典序列化将生成以下数据。如何用我们自己的属性/标签/标识符替换1/1/20183/31/2018d2p1:KeyValueOfintint

[CashCounter]中的序列化字典,

输出序列化后生成,如下所示

d2p1:Key

d2p1:Value

1 个答案:

答案 0 :(得分:1)

通过子集Dictionary<TKey, TValue>,应用CollectionDataContractAttribute并设置以下属性值,可以控制序列化为XML时字典的项,键和值元素名称:

  • ItemName:获取或设置字典键/值对元素的自定义名称。

  • KeyName:获取或设置字典键名元素的自定义名称。

  • ValueName:获取或设置字典值元素的自定义名称。

  • Namespace:如果需要,获取或设置数据协定的名称空间。

  • Name:如果需要,获取或设置字典类型的数据协定名称。当字典序列化为根对象时,它成为XML根元素名称。

    (由于字典不是数据模型中的根对象,因此在这种情况下无需设置此特定属性。)

因此,如果您按以下方式定义CashCounter数据模型(简化为删除不相关的成员):

[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/DictionarySerlization")]
public class CashCounter
{
    [DataMember]
    public BankNoteDictionary BankNote { get; set; }
}

[CollectionDataContract(ItemName = "MyItemName", KeyName = "MyKeyName", ValueName = "MyValueName",
    Namespace = "http://schemas.datacontract.org/2004/07/DictionarySerlization")]
public class BankNoteDictionary : Dictionary<int, int>
{
}

生成的XML将如下所示:

<CashCounter xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/DictionarySerlization">
  <BankNote>
    <MyItemName>
      <MyKeyName>10</MyKeyName>
      <MyValueName>6</MyValueName>
    </MyItemName>
    <MyItemName>
      <MyKeyName>5</MyKeyName>
      <MyValueName>10</MyValueName>
    </MyItemName>
  </BankNote>
</CashCounter>

注意: