.NET Framework 4.0 XmlSerializer and automatic collection properties
4615 ワード
System.Xml.Serialization.XmlSerializerの逆シーケンス化タイプは、集合の自動属性を含む.NET Framework 4.0では、次のような異常情報が放出されます.
集合属性Classesのset保護のためにprivate setterがあります.タイプは次のように定義されます.
以上の問題はNET Framework 3.0も登場し、マイクロソフトはNET Framework 3.5は修復しましたが、着きました.NET Framework 4.0問題が再現されました.インストールした場合.NET Framework 4.5では、この問題は発生しません.解決策は、以前と同様に自動プロパティを明示的なget、setに変更します.
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;
}
}
}