在没有初始化集合(值和条件)的情况下,我似乎无法反序列化类。我的愿望是在没有初始化集合的情况下反序列化XML文件。以下是我的课程:
[Serializable]
[XmlRoot(ElementName = "Swag")]
public class SwagCollection : SerializableObservalbleCollection<SwagItem>
{
}
[Serializable]
public class SwagItem : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string name;
private ObservableCollection<string> values = null;
private ObservableCollection<Condition> conditions = null;
public SwagItem()
{
values = null;
conditions = null;
}
[XmlAttribute]
public string Name
{
get
{
return this.name;
}
set
{
this.name = value;
OnPropertyChanged("Name");
}
}
[XmlArray("Values"), XmlArrayItem("ValueItem")]
public ObservableCollection<string> Values
{
get
{
return values;
}
set
{
values = value;
OnPropertyChanged("Values");
}
}
[XmlArray]
public ObservableCollection<Condition> Conditions
{
get
{
return conditions;
}
set
{
conditions = value;
OnPropertyChanged("Conditions");
}
}
}
我将其保存为程序集中的嵌入式资源:
<Swag xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SwagItem Name="Bob"/>
</Swag >
使用此方法检索资源中的XML没有问题:
private static T DeserializeFromResource<T>(string filename)
{
string result;
using (Stream stream = typeof (MyTestAssembly).Assembly.
GetManifestResourceStream("MyTestAssembly.Resources." + filename))
{
using (StreamReader sr = new StreamReader(stream))
{
result = sr.ReadToEnd();
}
}
XmlSerializer serializer = new XmlSerializer(typeof (T));
TextReader textReader = new StringReader(result);
return (T) serializer.Deserialize(textReader);
}
我在我们反序列化TextReader的最后一行之前放置一个断点,XML结构仍然只是一行,并且没有在XML中声明的空集合。
但是,当调用deserialize方法时,我的类中的集合正在初始化! (尽管在字段和构造函数中设置为null)。不幸的是,当我去保存我的XML文件时,我留下了空集:
<Swag xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SwagItem Name="Bob">
<Values />
<Conditions />
</SwagItem >
</Swag >
尽管将字段设置为空,但我似乎无法将XML和条件集合显示在XML中,如果它们为空。