2009-05-21 7 views
14

Dire que j'ai une classe simple comme siXmlSerializer et Collection propriété avec setter privé

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


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

Si je tente de désérialiser cela en utilisant XmlSerializer je reçois une erreur disant que MyCollection est en lecture seule et ne peut pas être affecté. Cependant je ne veux pas rendre le setter public car cela peut causer toutes sortes de problèmes si l'utilisateur de la classe lui assigne. FxCop met en garde à juste titre contre ceci: Collection properties should be read only

Cependant au bas de la page dans la communauté contenu ajouté est le suivant:

XmlSerializer COMPREND lecture seule collections Collection propriétés ne doivent pas être en lecture écrire pour le XmlSerializer à sérialiser et désérialiser le contenu correctement. Le XmlSerializer regardera une méthode appelée Ajouter à la collecte propriétés qui mettent en œuvre ICollection ou IEnumerable, et l'utiliser pour remplir la collection lorsque désérialisation une instance du propriétaire de type .

Cependant, cela ne semble pas être le cas (car j'obtiens le InvalidOperationException). Qu'est-ce que je suis capable de faire qui obéit à la meilleure pratique de garder le setter de propriété privée tout en me permettant d'utiliser le XmlSerializer?

Répondre

14

Votre Setter privé est à l'origine du problème. La classe XmlSerializer fonctionnera correctement avec la classe que j'ai donnée ci-dessous. La classe XmlSerializer a été inventée avant l'introduction de setters privés. Il est donc probable qu'elle ne vérifie pas correctement cette propriété lorsqu'elle analyse le type de classe à l'aide de la réflexion. Peut-être que vous devriez signaler cela à Microsoft comme un bug.

public class MyClass 
{ 
    private List<int> _myCollection; 

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

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

Bravo, qui l'a fixé. – Ray

+0

Quel bogue horrible. Je me demande si c'est corrigé en 4 ... – Will

+2

Ce bug (fonctionnalité?) Est toujours présent dans .NET 4 :( – drumsta

Questions connexes