2009-05-21 133 views
14

的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?

回答

14

您的私人二傳手導致了這個問題。 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