我正在尝试将对象序列化为 XML。下面是我需要的 XML 格式。
<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 时,我得到以下格式
<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>
请帮我解决这个问题。
从以下角度来看XmlSerializer
, the <parameter>
XML 的元素不是键/值对类的列表,因为在某些包含元素中没有每对的嵌套。相反,它是一个多态列表,其中每个条目可以是类型的元素<key>
或类型<value>
。因此,处理此问题的最简单方法可能是使用序列化器的内置功能来处理多态类型列表,如下所示:
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;
}
}
}
}
The [XmlArrayItem("someTypeName", typeof(SomeType))]装饰告诉序列化器该类型的数组元素SomeType
(在这种情况下ParameterKey<string>
and ParameterValue<string>
) 将使用元素名称进行序列化"someTypeName"
("key"
and "value"
, 分别。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)