Dot-Net

帶有私有設置器的 XmlSerializer 和 Collection 屬性

  • April 24, 2021

說我有一個像這樣的簡單課程

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


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

如果我嘗試使用 XmlSerializer 對其進行反序列化,則會收到一條錯誤消息,指出 MyCollection 是只讀的,無法分配給它。但是我不想公開設置器,因為如果類的使用者分配給它,這可能會導致各種問題。FxCop 正確地警告這一點:集合屬性應該是只讀的

然而,在社區頁面底部添加的內容是這樣的:

XmlSerializer 了解只讀集合 Collection 屬性不必是讀寫的,XmlSerializer 也可以正確序列化和反序列化內容。XmlSerializer 將在實現 ICollection 或 IEnumerable 的集合屬性上查找名為 Add 的方法,並在反序列化所有者類型的實例時使用該方法填充集合。

然而,情況似乎並非如此(因為我得到了 InvalidOperationException)。我能做什麼來遵守保持屬性設置器私有的最佳實踐,同時仍然允許我使用 XmlSerializer?

您的私人二傳手導致了這個問題。XmlSerializer 類將與我在下面給出的類一起正常工作。XmlSerializer 類是在引入私有 setter 之前發明的,因此在使用反射掃描類類型時可能無法正確檢查。也許您應該將此作為錯誤報告給 Microsoft。

public class MyClass
{
   private List<int> _myCollection;

   public MyClass()
   {
       _myCollection = new List<int>();
   }

   public List<int> MyCollection
   {
       get
       {
           return this._myCollection;
       }
   }
}

引用自:https://stackoverflow.com/questions/891449