2010-10-01 20 views
6

En C#, estoy tratando de serializar claseA en XML:de clase Serialize ToString() como XmlElement

[Serializable] 
public ClassA 
{ 
    [XmlElement] 
    public string PropertyA { get; set; } // works fine 

    [XmlElement] 
    public ClassB MyClassB { get; set; } 
} 

[Serializable] 
public ClassB 
{ 
    private string _value; 

    public override string ToString() 
    { 
     return _value; 
    } 
} 

Por desgracia, el resultado en serie es:

<PropertyA>Value</PropertyA> 
<ClassB /> 

En cambio, lo quiero ser:

<PropertyA>Value</PropertyA> 
<ClassB>Test</ClassB> 

... suponiendo _value == "Test". ¿Cómo hago esto? ¿Tengo tengo para proporcionar una propiedad pública en ClassB para _value? ¡Gracias!

ACTUALIZACIÓN:

Mediante la implementación de la interfaz IXmlSerializable en ClassB (shown here # 12), se genera el siguiente código XML:

<PropertyA>Value</PropertyA> 
<ClassB> 
    <Value>Test</Value> 
</ClassB> 

Esta solución es casi aceptable, pero sería bueno deshacerse de las etiquetas. ¿Algunas ideas?

Respuesta

3

como usted ha indicado, la única manera de hacer esto es para implementar la interfaz IXmlSerializable.

public class ClassB : IXmlSerializable 
{ 
    private string _value; 

    public string Value { 
     get { return _value; } 
     set { _value = value; } 
    } 

    public override string ToString() 
    { 
     return _value; 
    } 

    #region IXmlSerializable Members 

    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     _value = reader.ReadString(); 
    } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteString(_value); 
    } 

    #endregion 
} 

números de serie a la siguiente instancia ...

ClassB classB = new ClassB() { Value = "this class's value" }; 

devolverá el siguiente código XML:

<?xml version="1.0" encoding="utf-16"?><ClassB>this class's value</ClassB> 

Es posible que desee hacer algunas validaciones para que codifique etiquetas XML etc.

+1

¡Ahh, me has mostrado el problema! Estaba usando 'WriteElementString (" Value ", _value)' en lugar de 'WriteString (_value)'. Ahora mi XML se ve como yo quiero: ' Prueba' – Pakman

3

Has respondido a ti mismo. si se derivan de IXmlSerializable, puede cambiar el método de hacer exactamente (con suerte) lo que desea:

public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteElementString("ClassB",_value); 
    } 
+0

Ese código produce: ' prueba ' cuando realmente me gustaría: ' ' prueba Pakman

+1

modo, se puede utilizar en lugar de WriteString WriteElementString :-). * edit * - solo vi a alguien decir lo mismo :-( – itsho