代码之家  ›  专栏  ›  技术社区  ›  Ray

具有私有setter的XmlSerializer和Collection属性

  •  14
  • Ray  · 技术社区  · 15 年前

    假设我有一个这样简单的班级

    [Serializeable]
    public class MyClass
    {
        public MyClass()
        {
           this.MyCollection = new List<int>();
        }
    
    
        public List<int> MyCollection { get; private set;}
    }
    

    如果我尝试使用XmlSerializer反序列化此项,则会收到一个错误,说明MyCollection是只读的,无法分配给它。但是,我不想将setter公开,因为如果类的用户分配给它,这会导致各种各样的问题。fxcop正确地警告: Collection properties should be read only

    但是在社区页面底部添加的内容是:

    XmlSerializer了解只读 收藏集 属性不必是 将XmlSerializer读写到 对内容进行序列化和反序列化 正确地。XmlSerializer将查找 对于名为“加载项集合”的方法 实现ICollection的属性 或IEnumerable,并将其用于 在以下情况下填充集合 正在反序列化所有者的实例 类型。

    然而,似乎情况并非如此(当我得到InvalidOperationException时)。我能做什么呢?在允许我使用xmlserializer的同时,遵循保持属性setter私有的最佳实践?

    1 回复  |  直到 15 年前
        1
  •  14
  •   Community Egal    13 年前

    您的私有setter导致了这个问题。XmlSerializer类将与下面给出的类一起工作。xmlserializer类是在引入私有setter之前发明的,因此在使用反射扫描类类型时,它可能没有检查是否正确。也许你应该把这个作为一个bug报告给微软。

    public class MyClass
    {
        private List<int> _myCollection;
    
        public MyClass()
        {
            _myCollection = new List<int>();
        }
    
        public List<int> MyCollection
        {
            get
            {
                return this._myCollection;
            }
        }
    }