防止XmlSerializer在Deserialize上自动实例化List's

时间:2015-08-13 09:18:42

标签: c# deserialization xmlserializer

假设我有这个样本类:

public class MyClass
{
    public List<int> ListTest { get; set; }
    public string StringTest { get; set; }
    public int IntTest { get; set; }
}

这段代码:

string xmlStr = "<MyClass><StringTest>String</StringTest></MyClass>";
XElement xml = XElement.Parse(xmlStr);
XmlSerializer ser = new XmlSerializer(typeof(MyClass));
using (XmlReader reader = xml.CreateReader())
{
    var res = ser.Deserialize(reader);
}

完成反序列化后,res的值为:
ListTest - &gt; Count = 0的空列表(非空StringTest - &gt;如预期的“字符串”
IntTest - &gt;期望0(整数的默认值)。

我希望序列化程序与List的行为相同(default(List<T>) 为空),而不是实例化它们。

我怎样才能完成这样的事情呢? 顺便说一句,我必须使用XmlSerializer

2 个答案:

答案 0 :(得分:7)

您可以使用backup-property将属性序列化/反序列化为数组:

public class MyClass
{
    [XmlIgnore]
    public List<int> ListTest { get; set; }
    [XmlElement("ListTest")]
    public int[] _listTest
    {
        get { return ListTest?.ToArray(); }
        set { ListTest = value == null ? null : new List<int>(value); }
    }
    ...
}

答案 1 :(得分:0)

将您的财产标记为可以为空:

public class MyClass
{
    [XmlArray(IsNullable = true)]
    public List<int> ListTest { get; set; }
    public string StringTest { get; set; }
    public int IntTest { get; set; }
}