2009-09-23 12 views
6

Tengo dos clases de la siguiente manera:serialización XML de una colección en C#

public class Info 
    { 
     [XmlAttribute] public string language; 
     public int version; 
     public Book book; 

     public Info() { } 

     public Info(string l, int v, string author, int quantity, int price) 
     { 
     this.language = l; 
     this.version = v; 
     book = new Book(author, quantity, price); 
     } 


    } 

    public class Book 
    { 
      [XmlAttribute] public string author; 
      public int quantity; 
      public int price; 
      [XmlIgnore]public int total; 
      public NameValueCollection nvcollection = new NameValueCollection(); 

      public Book() { } 

      public Book(string author, int quantity, int price) 
      { 
      this.author = author; 
      this.quantity = quantity; 
      this.price = price; 
      total = quantity * price; 
      nvcollection.Add(author, price.ToString()); 
      } 

    } 

He creado un ArrayList que suma las dos instancias de Información de clase de la siguiente manera:

  FileStream fs = new FileStream("SerializedInfo.XML", FileMode.Create); 

      List<Info> arrList = new List<Info>(); 

      XmlSerializer xs = new XmlSerializer(typeof(List<Info>)); 

      Info pObj = new Info("ABC", 3, "DEF", 2, 6); 

      Info pObj1 = new Info("GHI", 4, "JKL", 2, 8); 

      arrList.Add(pObj); 
      arrList.Add(pObj1); 

      xs.Serialize(fs, arrList); 

      fs.Close(); 

Pero cuando intento serializar, obtengo una excepción como "Hubo un error que refleja el tipo 'System.Collections.Generic.List`1 [ConsoleApplicationSerialization.Info]'."

¿Alguien me puede ayudar con eso?

Además, en lugar de namevaluecollection, ¿qué tipo de estructura puedo usar?

Respuesta

3

NameValueCollection hace no directamente implementar la interfaz ICollection . En su lugar, NameValueCollection extiende NameObjectCollectionBase.Este implementa la interfaz ICollection , y la Agregar sobrecargada (system.string) método no se implementa en la clase NameValueCollection. Cuando se utiliza el XMLSerializer, la XmlSerializer intenta serializar o deserializar el NameValueCollection como un genérico ICollection. Por lo tanto, busca el defecto Añadir (System.String). En ausencia de la Añadir (System.string) método, se produce la excepción .

Trate de usar una clase de contenedor con la serialización personalizado:

http://nayyeri.net/serialize-namevaluecollection

Sin embargo, estoy seguro de lo que en realidad se está tratando de lograr. ¿Qué contendrá la nvcollection, excepto el autor del libro y el precio, una vez?

¿Tiene la intención de usarlo en el nivel del libro, o más alto en la jerarquía de objetos?

En lugar de utilizar un NameValueCollection, es posible que desee un diccionario, ya que tiene más flexibilidad en términos de lo que puede contener: http://johnwsaundersiii.spaces.live.com/blog/cns!600A2BE4A82EA0A6!699.entry

0

me encontré con su código, y la excepción interna que se obtiene es la siguiente:

Para ser XML serializable, tipos, que hereda de ICollection debe tener una implementación de Añadir (System.String) en absoluto niveles de su jerarquía de herencia . System.Collections.Specialized.NameValueCollection no implementa Add (System.String).

Por lo tanto, el serializador XML necesita un tipo de colección más simple. Creo que su mejor opción es convertir su NameValueCollection en una lista de una clase personalizada que contenga el nombre y el valor antes de la serialización.

+0

bien, si yo quito el NameValueCollection de la clase libro entonces todo funciona bien. A diferencia de clases – Archie

0

Actualizado: Parece que NamedValueCollection es su problema real ya que no es serializable. Tal vez podrías usar un Serializable dictionary.

+0

procesados ​​con la serialización estándar, las clases no tienen que tener el atributo Serializable para ser procesado con la serialización XML. – Archie

+0

mi error. Parece que tendrá que utilizar un código de serialización personalizado –

1

Observe las excepciones internas.

En primer lugar, necesita hacer una clase de libro serializable. Lo segundo es que NameValueCollection no se puede serializar con XmlSerializer porque:

"Para ser XML serializable, tipos, que hereda de ICollection debe tener una implementación de Añadir (System.String) en todos los niveles su herencia jerarquía. System.Collections.Specialized.NameValueCollection no implementa Add (System.String). "

Es el mensaje de la excepción interna.

funciona bien con este pedazo de código:

[Serializable] 
     public class Book 
     { 
      [XmlAttribute] 
      public string author; 
      public int quantity; 
      public int price; 
      [XmlIgnore] 
      public int total; 
      //public NameValueCollection nvcollection = new NameValueCollection(); 
      public Book() { } 
      public Book(string author, int quantity, int price) 
      { 
       this.author = author; 
       this.quantity = quantity; 
       this.price = price; 
       total = quantity * price; 
       //nvcollection.Add(author, price.ToString()); 
      } 
     } 
+0

El '[Serializable] atributo' No importa a la serialización XML. –