Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XmlArray在反序列化XML文件时总是初始化集合_C#_Xml_Serialization - Fatal编程技术网

C# XmlArray在反序列化XML文件时总是初始化集合

C# XmlArray在反序列化XML文件时总是初始化集合,c#,xml,serialization,C#,Xml,Serialization,在没有初始化集合值和条件的情况下,我似乎无法反序列化类。我希望在不初始化集合的情况下反序列化XML文件。下面是我的班级: [Serializable] [XmlRoot(ElementName = "Swag")] public class SwagCollection : SerializableObservalbleCollection<SwagItem> { } [Serializable] public class SwagItem : INotifyPropertyCha

在没有初始化集合值和条件的情况下,我似乎无法反序列化类。我希望在不初始化集合的情况下反序列化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中声明空集合

但是,当调用反序列化方法时,我的类中的集合将被初始化!尽管在字段和构造函数中设置为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中,尽管将它们的字段设置为null。

不知道如何防止集合被分配,但可以通过提供一个方法来防止空集合被序列化,例如`bool ShouldSerializeValues'{返回值!=null&&values.Count>0;}很好,谢谢。