2009-09-06 11 views
5

tengo un archivo XML buscando algo como esto:La implementación IXmlSerializable en un objeto de colección

<xml> 
    <A>value</A> 
    <B>value</B> 
    <listitems> 
    <item> 
     <C>value</C> 
     <D>value</D> 
    </item> 
    </listitems> 
</xml> 

y tengo un dos objetos que representan esta xml:

class XmlObject 
{ 
    public string A { get; set; } 
    public string B { get; set; } 
    List<Item> listitems { get; set; } 
} 

class Item : IXmlSerializable 
{ 
    public string C { get; set; } 
    public string D { get; set; } 

    //Implemented IXmlSerializeable read/write 
    public void ReadXml(System.Xml.XmlReader reader) 
    { 
    this.C = reader.ReadElementString(); 
    this.D = reader.ReadElementString(); 
    } 
    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
    writer.WriteElementString("C", this.C); 
    writer.WriteElementString("D", this.D); 
    } 
} 

utilizo el XmlSerializer para serializar/deserializar el XmlObject al archivo.

El problema es que cuando implementé las funciones IXmlSerializable personalizadas en mi elemento "subobjeto", siempre obtengo un elemento (el primero) en mi colección XmlObject.listitems al deserializar el archivo. Si elimino el: IXmlSerializable todo funciona como se esperaba.

¿Qué hago mal?

Editar: He implementado IXmlSerializable.GetSchema y necesito usar IXmlSerializable en mi "objeto hijo" para hacer alguna transformación de valor personalizado.

Respuesta

2

modificar el código de la siguiente manera:

public void ReadXml(System.Xml.XmlReader reader) 
    { 
     reader.Read(); 
     this.C = reader.ReadElementString(); 
     this.D = reader.ReadElementString(); 
     reader.Read(); 
    } 

Primero omita el inicio del nodo Elemento, lea las dos cadenas, luego lea más allá del nodo final para que el lector se encuentre en el lugar correcto. Esto leerá todos los nodos en la matriz.

Debe prestar atención al modificar xml usted mismo :)

+0

Muchas gracias. –

1

No necesita usar IXmlSerializable. Pero si lo desea, debe implementar el método GetShema(). Después de un cierto código modificación que funciona parece que:

[XmlRoot("XmlObject")] 
public class XmlObject 
{ 
    [XmlElement("A")] 
    public string A { get; set; } 
    [XmlElement("B")] 
    public string B { get; set; } 
    [XmlElement("listitems")] 
    public List<Item> listitems { get; set; } 
} 

public class Item : IXmlSerializable 
{ 
    [XmlElement("C")] 
    public string C { get; set; } 
    [XmlElement("D")] 
    public string D { get; set; } 

    #region IXmlSerializable Members 

    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     throw new NotImplementedException(); 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     this.C = reader.ReadElementString(); 
     this.D = reader.ReadElementString(); 
    } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteElementString("C", this.C); 
     writer.WriteElementString("D", this.D); 
    } 

    #endregion 
} 

Resultados para 2 artículos en ITEMLIST se verá así:

<?xml version="1.0" encoding="utf-8"?> 
<XmlObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <A>value</A> 
    <B>value</B> 
    <listitems> 
    <C>value0</C> 
    <D>value0</D> 
    </listitems> 
    <listitems> 
    <C>value1</C> 
    <D>value1</D> 
    </listitems> 
</XmlObject> 
+0

Eso no cambió nada. Pero gracias por intentarlo –

Cuestiones relacionadas