gpt4 book ai didi

c# - DataContract 中字典的自定义序列化

转载 作者:行者123 更新时间:2023-11-30 17:59:24 26 4
gpt4 key购买 nike

基本上我有一个 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>

字典键被限制为字符串,所以如果没有人有使用非 ascii 键的愚蠢想法,那应该可以正常工作。我找到了 CollectionDataContract 属性,我更接近我想要的东西,但键值对将被完整保存,这会浪费内存。也许可以使用 ISerializable 类进行 slove,但我不确定这是否会给 DataContractSerializer 带来一些麻烦。顺便说一句,该解决方案还应与 DataContractJsonSerializer 一起使用。

最佳答案

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

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

使用 WriteXml 和 ReadXml 函数控制将 XmlWriter 作为参数传递到流中的 xml。

例如这个函数

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 & Value,123)。

哦,关于 JSON,有一个 IJsonSerializable但我从来没有抽出时间来使用它。

关于c# - DataContract 中字典的自定义序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11235041/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com