.NET Framework 4.0 XmlSerializer and automatic collection properties

System.Xml.Serialization.XmlSerializer反序列化类型包含集合自动属性运行在.NET Framework 4.0下则会抛出如下异常信息:

System.InvalidOperationException: Unable to generate a temporary class (result=1).

error CS0200: Property or indexer 'SomeClass.CollectionProperty' cannot be assigned to — it is read only.

出于对集合属性Classes的set保护,它有一个private setter。类型定义如下:

[XmlRoot(ElementName = "container")]
public sealed class MyContainer
{
    public MyContainer()
    {
        this.Classes = new List<MyClass>();
    }

    [XmlArray(ElementName = "classes", IsNullable = true)]
    [XmlArrayItem(ElementName = "class", Type = typeof(MyClass))]
    public List<MyClass> Classes { get; private set; }
}

public sealed class MyClass
{
    [XmlAttribute(AttributeName = "value")]
    public Int32 Value { get; set; }
}

以上问题在.NET Framework 3.0也曾出现,微软在.NET Framework 3.5修复了它,但到了.NET Framework 4.0问题重现,如果你已安装了.NET Framework 4.5则不会遇到该问题。解决方法和之前一样将自动属性修改为显式的get、set。

[XmlRoot(ElementName = "container")]
public sealed class MyContainer
{
    private List<MyClass> _classes;

    public MyContainer()
    {
        _classes = new List<MyClass>();
    }

    [XmlArray(ElementName = "classes", IsNullable = true)]
    [XmlArrayItem(ElementName = "class", Type = typeof(MyClass))]
    public List<MyClass> Classes 
    {
        get 
        {
            return _classes;
        }
    }
}
原文地址:https://www.cnblogs.com/junchu25/p/2818873.html