C# 内联数组的DataContractSerializer
我需要为Windows应用程序序列化和反序列化以下XML(它是一个现有的API,已经被iOS和Android应用程序很好地处理)。请注意多个项目: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
家
今天
福
酒吧
巴兹
所以我上了这个课:
[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输出的方式,这正是您所需要的。