内联数组的DataContractSerializer
本文关键字:DataContractSerializer 数组 | 更新日期: 2023-09-27 17:57:51
我需要为Windows应用程序序列化和反序列化以下XML(它是一个现有的API,iOS和Android应用程序已经处理好了)。请注意多个项目:
<parameters>
<source>home</source>
<day>today</day>
<item><name>foo</name></item>
<item><name>bar</name></item>
<item><name>baz</name></item>
</parameters>
所以我上了这个课:
[DataContract(Name = "parameters", Namespace = "")]
internal class Parameters
{
[DataMember(Name = "source", EmitDefaultValue = false, Order = 0)]
public string Source;
[DataMember(Name = "day", EmitDefaultValue = false, Order = 1)]
public string Day;
[DataMember(Name = "item", EmitDefaultValue = false, Order = 2)]
public Item[] Items;
}
[DataContract(Name = "item", Namespace = "")]
internal class Item
{
[DataMember(Name = "name", EmitDefaultValue = false, Order = 0)]
public string Name;
}
我的DataContractSerializer
代码是:
// Serialization:
using (var streamObject = new MemoryStream())
using (var reader = new StreamReader(streamObject))
{
var ser = new DataContractSerializer(typeof(T));
ser.WriteObject(streamObject, objForSerialization);
streamObject.Position = 0;
return reader.ReadToEnd();
}
[...]
// Deserialization:
using (var streamObject = new MemoryStream(Encoding.UTF8.GetBytes(xmlData)))
{
var ser = new DataContractSerializer(typeof(T));
return (T)ser.ReadObject(streamObject);
}
但最终的序列化并不是我所需要的:
<parameters>
<source>home</source>
<day>today</day>
<item>
<item><name>foo</name></item>
<item><name>bar</name></item>
<item><name>baz</name></item>
</item>
</parameters>
而且它不允许我反序列化第一个示例!
您必须自己实现IXmlSerializable并创建一个自定义xml,因为您不需要数组的开始和结束属性。
否则,您只需要使用一堆Item属性,这是不明智的。。
详细介绍了我最终是如何实现IXmlSerializable的:
[XmlRoot("parameters")]
internal class Parameters
{
public string Source;
public string Day;
public List<Item> Items;
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
reader.ReadStartElement();
Source = reader.ReadElementContentAsString("source", "");
Day = reader.ReadElementContentAsString("day", "");
var newItems = new List<Item>();
while (reader.LocalName == "item")
{
var newItem = new Item();
newItem.ReadXml(reader);
newItems.Add(newItem);
}
Items = newItems;
reader.ReadEndElement();
}
public void WriteXml(XmlWriter writer)
{
writer.WriteElementString("source", Source);
writer.WriteElementString("day", Day);
foreach (Item item in Items)
{
writer.WriteStartElement("item");
item.WriteXml(writer);
writer.WriteEndElement();
}
}
}
我不喜欢IXmlSerializable相当长并且与DataContract不兼容的事实。