内联数组的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>

而且它不允许我反序列化第一个示例!

内联数组的DataContractSerializer

您必须自己实现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不兼容的事实。

相关文章:
  • 没有找到相关文章