當前我試圖序列化並反序列化一些我的類到XML。一種方式(列表 - > XML)完美工作(請參見下面的示例)。另一種方式將無法正常工作。 我想要反序列化的類包含另一個類的另一個列表。這在XML文件中也是正確的。但是當我反序列化這個類時,它將不起作用。XML(De)列表序列化
在下面的例子中,這意味着Foo類可以通過其List of Bars正確地序列化。但是,當我反序列化的XML文件只有FooString和其他屬性被正確序列化。酒吧名單每次都是空的。調試器也不會隨時進入。
有人能告訴我我做錯了什麼嗎?
在此先感謝!
主被攝體看起來像這樣:
[XmlInclude(typeof (Bar))]
[XmlRoot(ElementName = "Foo")]
public class Foo() : IFooInterface
{
[XmlElement("FooString")]
public string FooString
{
// For simplifaction auto proerty, normally with
// backing field
get;
set;
}
// Some other properties for the xml
// ...
// Dirty Hack to serialize the List, because an Interface could not be serialized
// I've already tried to remove this tag, to replace it with [XmlElement("BarList")], but nothing works
[XmlArray("BarList")]
[XmlArrayItem(ElementName = "Bar", Type = typeof(Bar))]
public List<Bar> XmlBarList
{
get
{
return this.BarList.Select(bar => bar as Bar).ToList();
}
set
{
this.BarList = new ObservableCollection<IBarInterface>(value);
}
}
private ObservableCollection<IBarInterface> barList;
[XmlIgnore]
public ObservableCollection<IBarInterface> BarList
{
get
{
return this.barList;
}
set
{
// For simplification removed Notification Proerties
this.barList = value;
}
}
}
嵌套類看起來像這樣:
[XmlType("Bar")]
public class Bar : IBarInterface
{
[XmlElement("BarString")]
public string BarString
{
get;
set;
}
// Some other properties for the xml
// ...
}
該(解)序列化的類的類:
public class FooBarProvider()
{
// Won't work
// the BarList of any Foo item is everytime
// empty.
public List<Foo> Load()
{
var reader = new StreamReader("PathToTheXml.xml");
var serializer = new XmlSerializer(typeof(List<Foo>));
var list = (List<Foo>)serializer.Deserialize(reader);
}
// Works
public void Save(List<Foo> fooList)
{
var serializer = new XmlSerializer(typeof(List<Foo>));
var writer = new StreamWriter("PathToTheXml.xml");
serializer.Serialize(writer, fooList);
writer.Close();
}
}
這是生成的XML文件:
<ArrayOfFoo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Foo>
<BarList>
<Bar>
<BarString>Hello Bar!</BarString>
</Bar>
</BarList>
<FooString>Hello Foo!</FooString>
</Foo>
</ArrayOfFoo>
您好,感謝您的回覆。但是這也沒有奏效。我試過了。我也嘗試刪除標籤,並讓它自動決定。但是我所做的一切 - 它不會奏效:/你有另一種方法嗎? – CodeRain
更新的代碼。應該工作 – jdweng
謝謝你的工作:) – CodeRain