将KeyValuePair列表序列化为XML

我试图将一个Object serailize为XML。 以下是我需要的XML格式。

  Key1 Value1 Key2 Value2 Key3 value3   

以下是我创建的模型

 [Serializable] [XmlType("parameters")] public class parameters { public List<parameter> parameter { get; set; } } [Serializable] [XmlType("parameter")] public class parameter { 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时,我得到以下格式

    Key1 Value1   Key2 Value2   Key3 Value3    

请帮我解决这个问题。

XmlSerializer的角度来看,XML的元素不是键/值对类的列表,因为在某些包含元素中没有每对的嵌套。 相反,它是一个多态列表 ,其中每个条目可以是类型或类型的元素。 因此,处理此问题的最简单方法可能是使用序列化程序的内置function来处理多态类型列表,如下所示:

 public abstract class ParameterKeyOrValue { [XmlText] public T Text { get; set; } } public sealed class ParameterKey : ParameterKeyOrValue { } public sealed class ParameterValue : ParameterKeyOrValue { } [Serializable] [XmlType("parameters")] public class parameters { [XmlIgnore] public List> parameter { get; set; } [XmlArray("parameter")] [XmlArrayItem("key", typeof(ParameterKey))] [XmlArrayItem("value", typeof(ParameterValue))] [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DebuggerBrowsable(DebuggerBrowsableState.Never)] public ParameterKeyOrValue[] XmlParameters { get { if (parameter == null) return null; return parameter.SelectMany(p => new ParameterKeyOrValue[] { new ParameterKey { Text = p.key }, new ParameterValue { 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>().Zip(value.OfType>(), (k, v) => new parameter(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数组元素(在本例中为ParameterKeyParameterValue )将序列化为元素名称"someTypeName""key""value" ,分别。)

您需要使参数包含键值列表(顺便说一句.net有几个为您执行此操作的集合,如Dictionary),例如:

 public class Parameter{ public Dictionary Values {get; set;} public Parameter() { Values = new Dictionary(); } public void AddParameter(K key, V value) { Values.Add(key,value); } ...Other access methods here } 

或者在参数中只需将其作为键值列表或字典:

 public class Parameters{ public Dictionary Parameters {get; set;} public Parameters(){ Parameters = new Dictionary(); } } 

第二种选择显然是最好的选择,因为第一种选择只是重新发明.net字典。 第一个似乎没有任何好处。

这是面包和黄油的东西,所以如果你真的不了解数组和.net集合,你应该熟悉这个领域。 搜索堆栈溢出将为您提供所需的一切。

你可以使用XmlElementAttribute.ElementName属性来命名参数字典,它应该产生你想要的结果,虽然我会质疑为什么在参数节点内你只需要一个参数节点?

有效的xml必须包含一个根标记才能包含它的子项。