使用DataContractSerializer进行字典序列化将生成以下数据。如何用我们自己的属性/标签/标识符替换1/1/2018
,3/31/2018
和d2p1:KeyValueOfintint
。
[CashCounter]中的序列化字典,
输出序列化后生成,如下所示
d2p1:Key
d2p1:Value
答案 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>
注意:
您应该考虑将名称空间替换为永久性内容。
名称空间是data contract name的一部分。当前,它具有与您的c#名称空间相关的一些默认值,因此,如果您重构代码并将类放入不同的c#名称空间,则数据协定名称空间可能会更改。由于数据合同名称空间实际上是在您的WSDL中发布的,因此可能会对您的客户造成麻烦。您可能还希望通过在开头包含组织的URL来将命名空间用于品牌目的。
有关更多信息,请参见 What does adding Name and Namespace to DataContract do? 和 What are XML namespaces for? 。
有关文档,请参见Collection Types in Data Contracts: Customizing Dictionary Collections。