2009-05-21 3 views
14

Say mam prostą klasę podobnie jakXmlSerializer i własność prywatna kolekcja seter

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


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

Gdy próbuję deserializowania to przy użyciu XmlSerializer otrzymuję komunikat o błędzie informujący, że MyCollection jest tylko do odczytu i nie można przypisać. Nie chcę jednak ustawiać odbiorcy jako publicznego, ponieważ może to spowodować różnego rodzaju problemy, jeśli użytkownik klasy przydzieli mu to zadanie. FxCop słusznie ostrzega przed tym: Collection properties should be read only

Jednak na dole strony we wspólnocie dodana treść jest taka:

XmlSerializer rozumie tylko do odczytu kolekcje Kolekcja właściwości nie muszą być do odczytu napisać dla XmlSerializer do serializować i deserializować zawartość poprawnie. XmlSerializer będzie wyglądać na metodzie zwanej Dodaj na kolekcji właściwości, które implementują kolekcji ICollection lub IEnumerable i używać, aby wypełnić kolekcji gdy deserializacji wystąpienie właściciela typu.

Jednak tak się nie dzieje (ponieważ otrzymuję wyjątek InvalidOperationException). Co mogę zrobić, jeśli przestrzega się najlepszej praktyki utrzymywania prywatnego właściciela nieruchomości, a jednocześnie pozwala mi korzystać z XmlSerializer?

Odpowiedz

14

Twój prywatny seter jest przyczyną problemu. Klasa XmlSerializer będzie działać poprawnie w klasie, którą podałem poniżej. Klasa XmlSerializer została wymyślona przed wprowadzeniem seterów prywatnych, więc prawdopodobnie nie sprawdza tego poprawnie, gdy skanuje typ klasy za pomocą refleksji. Może powinieneś zgłosić to firmie Microsoft jako błąd.

public class MyClass 
{ 
    private List<int> _myCollection; 

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

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

Pozdrawiam, to naprawiłem. – Ray

+0

Co za okropny błąd. Ciekawe czy jest naprawione w 4 ... – Will

+2

Ten błąd (funkcja?) Nadal występuje w .NET 4 :( – drumsta