2009-05-21 23 views
14

Decir que tengo una clase simple como tanXmlSerializer y Colección propiedad privada con colocador

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


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

Si trato de deserializar esto utilizando XmlSerializer me sale un error diciendo que MiColeccion es de sólo lectura y no puede ser asignado a. Sin embargo, no quiero que el colocador sea público ya que esto puede causar todo tipo de problemas si el usuario de la clase lo asigna. FxCop advierte con razón contra esta: Collection properties should be read only

Sin embargo, en la parte inferior de la página en la comunidad de contenido añadido es la siguiente:

XmlSerializer entiende colecciones de sólo lectura Colección propiedades no tienen que ser lectura escriba para XmlSerializer en serialice y deserialice los contenidos correctamente. XmlSerializer se verá por un método llamado Añadir en la recopilación de propiedades que implementan ICollection o IEnumerable, y el uso que poblar la colección cuando deserializar una instancia del propietario tipo.

Sin embargo, simplemente no parece ser el caso (ya que obtengo la InvalidOperationException). ¿Qué puedo hacer que obedezca la mejor práctica de mantener privado el establecimiento de propiedades mientras todavía me permite usar el XmlSerializer?

Respuesta

14

Su formador privado está causando el problema. La clase XmlSerializer funcionará bien con la clase que he dado a continuación. La clase XmlSerializer se inventó antes de que se introdujeran los setters privados, por lo que probablemente no se verifica correctamente cuando escanea el tipo de clase mediante reflexión. Tal vez deberías informar esto a Microsoft como un error.

public class MyClass 
{ 
    private List<int> _myCollection; 

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

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

Saludos, eso lo arregló. – Ray

+0

¡Qué terrible error! Me pregunto si está arreglado en 4 ... – Will

+2

Este error (¿característica?) Todavía está presente en .NET 4 :( – drumsta

Cuestiones relacionadas