В настоящее время я пытаюсь сериализовать и десериализовать некоторые из моих классов в XML. Один способ (List -> XML) отлично работает (см. Пример ниже). Другой способ не будет работать правильно. Класс, который я не хочу deserialize, содержит другой список другого класса. Это также верно в файле XML. Но когда я десериализую класс, это не сработает.XML (De) Сериализация списка
В приведенном ниже примере это означает, что класс Foo корректно сериализуется со своим списком баров. Но когда я десериализую только 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