2009-05-21 1 views
14

Sagen wir, ich habe eine einfache Klasse wie soXmlSerializer und Sammlung Immobilien mit eigenem Setter

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


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

Wenn ich versuche, dies mit XmlSerializer Deserialisieren erhalte ich eine Fehlermeldung, dass MyCollection nur lesbar ist und nicht zugeordnet werden können. Allerdings möchte ich den Setter nicht öffentlich machen, da dies zu Problemen aller Art führen kann, wenn der Benutzer der Klasse es zuweist. FxCop warnt zu Recht dagegen: Collection properties should be read only

jedoch am unteren Rand der Seite in der Gemeinde hinzugefügter Inhalt ist dies:

XmlSerializer read-only versteht Sammlungen Sammlung Eigenschaften haben nicht Read- sein Schreiben Sie für den XmlSerializer auf Serialize und Deserialize den Inhalt korrekt. Die XmlSerializer sieht für eine Methode hinzufügen auf Sammlung namens Eigenschaften, die ICollection oder IEnumerable implementieren und verwenden, die auf die Sammlung füllen, wenn eine Instanz des Eigentümers Typ deserialisiert.

Allerdings scheint es einfach nicht der Fall zu sein (wie ich die InvalidOperationException bekomme). Was kann ich tun, um der Best Practice zu folgen, den Property-Setter privat zu halten und gleichzeitig den XmlSerializer zu verwenden?

Antwort

14

Ihr privater Setter verursacht das Problem. Die XmlSerializer-Klasse funktioniert gut mit der Klasse, die ich unten angegeben habe. Die XmlSerializer-Klasse wurde erfunden, bevor private Setter eingeführt wurden. Daher wird sie wahrscheinlich nicht korrekt überprüft, wenn sie den Klassentyp mithilfe von Reflektion durchsucht. Vielleicht sollten Sie dies Microsoft als Fehler melden.

public class MyClass 
{ 
    private List<int> _myCollection; 

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

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

Prost, das hat es behoben. – Ray

+0

Was für ein schrecklicher Fehler. Frage mich, ob es in 4 behoben ist ... – Will

+2

Dieser Fehler (Feature?) Noch in .NET 4 vorhanden :( – drumsta