C# 内联数组的DataContractSerializer

C# 内联数组的DataContractSerializer,c#,arrays,windows-phone-8,xml-serialization,datacontractserializer,C#,Arrays,Windows Phone 8,Xml Serialization,Datacontractserializer,我需要为Windows应用程序序列化和反序列化以下XML(它是一个现有的API,已经被iOS和Android应用程序很好地处理)。请注意多个项目: 家 今天 福 酒吧 巴兹 所以我上了这个课: [DataContract(Name=“parameters”,Namespace=”“)] 内部类参数 { [DataMember(Name=“source”,EmitDefaultValue=false,Order=0)] 公共字符串源; [DataMember(Name=“day”,EmitDe

我需要为Windows应用程序序列化和反序列化以下XML(它是一个现有的API,已经被iOS和Android应用程序很好地处理)。请注意多个项目:


家
今天
福
酒吧
巴兹
所以我上了这个课:

[DataContract(Name=“parameters”,Namespace=”“)]
内部类参数
{
[DataMember(Name=“source”,EmitDefaultValue=false,Order=0)]
公共字符串源;
[DataMember(Name=“day”,EmitDefaultValue=false,Order=1)]
公众弦乐日;
[DataMember(Name=“item”,EmitDefaultValue=false,Order=2)]
公共物品【】项;
}
[DataContract(Name=“item”,Namespace=”“)]
内部类项目
{
[DataMember(Name=“Name”,EmitDefaultValue=false,Order=0)]
公共字符串名称;
}
我的带有
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);
}
但结果序列化并不是我所需要的:


家
今天
福
酒吧
巴兹

它不会让我反序列化第一个例子

您必须自己实现IXmlSerializable并创建自定义xml,因为您不需要数组的开始和结束属性


否则,您将不得不使用一组项属性,这是不明智的

最后给出了我如何实现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();
        }
    }
}
[XmlRoot(“参数”)]
内部类参数
{
公共字符串源;
公众弦乐日;
公共清单项目;
公共XmlSchema GetSchema()
{
返回null;
}
公共void ReadXml(XmlReader)
{
reader.ReadStartElement();
Source=reader.ReadElementContentAsString(“Source”,即“”);
Day=reader.ReadElementContentAsString(“日”,“日”);
var newItems=新列表();
while(reader.LocalName==“项”)
{
var newItem=newItem();
ReadXml(reader);
newItems.Add(newItem);
}
项目=新项目;
reader.ReadEndElement();
}
public void WriteXml(XmlWriter)
{
writer.WriteElementString(“source”,source);
WriteElementString(“天”,天);
foreach(项目中的项目)
{
编写人。书面启动项(“项目”);
item.WriteXml(编写器);
writer.writeedelement();
}
}
}

我不喜欢IXmlSerializable非常冗长,并且与DataContract不兼容,尽管。

一堆项属性,您的意思是像
[DataMember(Name=“Item”)]Item Item1;[DataMember(Name=“item”)]项项2?然后它只处理固定数量的物品。是的,它只处理固定数量的物品,这就是为什么我说它不聪明的原因。实现IXmlSerializable可以让您选择xml输出的方式,这正是您所需要的。