私人二传手

私人二传手

问题描述:

的XmlSerializer和集合属性说我有一个简单的类,像这样私人二传手

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


    public List<int> MyCollection { get; private set;} 
} 

如果我尝试反序列化这个XmlSerializer的使用,我得到一个错误,指出MyCollection的是只读的,不能被分配到。不过,我不希望公开让二传手,因为如果这个班的使用者给它分配的话,这会导致各种各样的问题。 FxCop的正确警告说,不要这样:Collection properties should be read only

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

XmlSerializer的理解只读 集合集合 属性没有被 读 - 写入XmlSerializer以 正确地序列化并反序列化内容 。 XmlSerializer的会看 一个名为添加上收集实现ICollection的 或IEnumerable的 特性的方法,并用它来 填充集合时 反序列化的所有者 类型的实例。

但它似乎并不是这样(因为我得到InvalidOperationException)。我能做什么遵循保持属性setter为private的最佳做法,同时仍允许使用XmlSerializer?

您的私人二传手导致了这个问题。 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; 
     } 
    } 
} 
+0

干杯,固定它。 – Ray 2009-05-21 20:42:51