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