将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
数组元素(在本例中为ParameterKey
和ParameterValue
)将序列化为元素名称"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
必须包含一个根标记才能包含它的子项。