将KeyValuePair列表序列化为XML [英] serializing a list of KeyValuePair to XML
问题描述
我正在尝试将对象序列化为XML.下面是我需要的XML格式.
I am trying to serailize an Object into XML. Below is the XML format which I need.
<parameters>
<parameter>
<key>Key1</key>
<value>Value1</value>
<key>Key2</key>
<value>Value2</value>
<key>Key3</key>
<value>value3</value>
</parameter>
</parameters>
下面是我创建的模型
[Serializable]
[XmlType("parameters")]
public class parameters
{
public List<parameter<string,string>> parameter { get; set; }
}
[Serializable]
[XmlType("parameter")]
public class parameter<K,V>
{
public K key { get; set; }
public V value { get; set; }
public parameter() { }
public parameter(K key, V value)
{
this.key = key;
this.value = value;
}
}
当我尝试序列化为XML时,我得到以下格式
When I try to serialize to XML I get the below format
<parameters>
<parameter>
<parameter>
<key>Key1</key>
<value>Value1</value>
</parameter>
<parameter>
<key>Key2</key>
<value>Value2</value>
</parameter>
<parameter>
<key>Key3</key>
<value>Value3</value>
</parameter>
</parameter>
</parameters>
请帮助我解决这个问题.
Kindly help me to solve this.
推荐答案
从 XmlSerializer
的角度来看,XML的< parameter>
元素是"t键/值对类的列表,因为在某些包含元素中没有每个对的嵌套.相反,它是多态列表,其中每个条目可以是< key>类型的元素
或< value>
类型.因此,最简单的方法可能是使用序列化程序的内置功能来处理多态类型的列表,如下所示:
From the point of view of XmlSerializer
, the <parameter>
element of your XML isn't a list of key/value pair classes, because there's no nesting of each pair in some containing element. Instead it's a polymorphic list, where each entry can be an element of type <key>
or of type <value>
. So the easiest way to handle this may be to use the built-in functionality of the serializer for handling lists of polymorphic types as follows:
public abstract class ParameterKeyOrValue<T>
{
[XmlText]
public T Text { get; set; }
}
public sealed class ParameterKey<T> : ParameterKeyOrValue<T>
{
}
public sealed class ParameterValue<T> : ParameterKeyOrValue<T>
{
}
[Serializable]
[XmlType("parameters")]
public class parameters
{
[XmlIgnore]
public List<parameter<string, string>> parameter { get; set; }
[XmlArray("parameter")]
[XmlArrayItem("key", typeof(ParameterKey<string>))]
[XmlArrayItem("value", typeof(ParameterValue<string>))]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DebuggerBrowsable(DebuggerBrowsableState.Never)]
public ParameterKeyOrValue<string>[] XmlParameters
{
get
{
if (parameter == null)
return null;
return parameter.SelectMany(p => new ParameterKeyOrValue<string>[] { new ParameterKey<string> { Text = p.key }, new ParameterValue<string> { Text = p.value } }).ToArray();
}
set
{
if (value == null)
parameter = null;
else
{
if (value.Length % 2 != 0)
throw new ArgumentException("Unequal number of keys and values");
var newParameters = value.OfType<ParameterKey<string>>().Zip(value.OfType<ParameterValue<string>>(), (k, v) => new parameter<string, string>(k.Text, v.Text)).ToList();
// Make sure we got an equal number of keys and values.
if (newParameters.Count != value.Length / 2)
throw new ArgumentException("Unequal number of keys and values");
parameter = newParameters;
}
}
}
}
[XmlArrayItem("someTypeName,typeof(SomeType))]
装饰告诉序列化程序类型为 SomeType
的数组元素(在本例中为 ParameterKey< string>
和 ParameterValue< string>
)将使用元素名称"someTypeName"
(键"
和"value"
)进行序列化>.)
The [XmlArrayItem("someTypeName", typeof(SomeType))]
decorations tell the serializer that array elements of type SomeType
(in this case ParameterKey<string>
and ParameterValue<string>
) are to be serialized with element name "someTypeName"
("key"
and "value"
, respectively.)
这篇关于将KeyValuePair列表序列化为XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!