2009-05-21 14 views
14

dire che ho un semplice classe in questo modoXmlSerializer e Collezione di proprietà con il setter privata

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


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

Se provo a deserializzare questo utilizzando XmlSerializer ottengo un errore dicendo che MyCollection è in sola lettura e non può essere assegnato a. Tuttavia, non voglio rendere pubblico il setter in quanto ciò può causare tutti i tipi di problemi se l'utente della classe lo assegna. FxCop giustamente mette in guardia contro questo: Collection properties should be read only

Tuttavia nella parte inferiore della pagina nella comunità contenuto aggiunto è questo:

XmlSerializer capisce collezioni di sola lettura Collection proprietà non devono essere sola lettura scrivere per XmlSerializer su serializzare e deserializzare correttamente il contenuto . Il XmlSerializer cercherà per un metodo chiamato Aggiungi sulla raccolta proprietà che implementano ICollection o IEnumerable, e l'uso che per popolare l'insieme quando deserializzazione un'istanza del proprietario tipo.

Tuttavia non sembra essere il caso (come ho ottenuto l'InvalidOperationException). Che cosa sono in grado di fare che obbedisce alla migliore pratica di mantenere privato il setter della proprietà pur continuando a consentirmi di utilizzare XmlSerializer?

risposta

14

Il tuo setter privato sta causando il problema. La classe XmlSerializer funzionerà correttamente con la classe che ho fornito di seguito. La classe XmlSerializer è stata inventata prima che venissero introdotti i setter privati, quindi probabilmente non lo controlla correttamente quando esegue la scansione del tipo di classe usando reflection. Forse dovresti segnalarlo a Microsoft come un bug.

public class MyClass 
{ 
    private List<int> _myCollection; 

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

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

Cheers, che ha riparato. – Ray

+0

Che bug terribile. Mi chiedo se è stato risolto in 4 ... – Will

+2

Questo bug (funzione?) Ancora presente in .NET 4 :( – drumsta

Problemi correlati