zoukankan      html  css  js  c++  java
  • .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;
            }
        }
    }
  • 相关阅读:
    循序渐进学Python 1 安装与入门
    常用yum命令小结
    为CentOS配置网易163的yum源
    PHP合并数组+与array_merge的区别
    让Docker功能更强大的10个开源工具
    Docker入门系列8
    Docker入门系列7 动态映射端口port mapping
    e 的由来
    ROS教程5 使用串口
    1 ROS+ 使用ORB_SLAM2进行全场定位
  • 原文地址:https://www.cnblogs.com/junchu25/p/2818873.html
Copyright © 2011-2022 走看看