在反序列化XML文件时,XmlArray始终初始化集合

时间:2014-11-24 23:13:40

标签: c# xml serialization

在没有初始化集合(值和条件)的情况下,我似乎无法反序列化类。我的愿望是在没有初始化集合的情况下反序列化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中,如果它们为空。

0 个答案:

没有答案