.NET Framework 4.0 XmlSerializer and automatic collection properties

4615 ワード

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;
        }
    }
}