2010-10-01 15 views
6

In C#, sto cercando di serializzare ClasseA in XML:della classe Serialize ToString() come 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; 
    } 
} 

Purtroppo, il risultato serializzato è:

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

Invece, lo voglio essere:

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

... assumendo _value == "Test". Come faccio a fare questo? I hanno per fornire una proprietà pubblica in ClassB per _value? Grazie!

UPDATE:

implementando l'interfaccia IXmlSerializable in ClassB (shown here # 12), il seguente codice XML viene generato:

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

Questa soluzione è quasi accettabile, ma sarebbe bello sbarazzarsi dei tag. Qualche idea?

risposta

3

Come hai indicato, l'unico modo per farlo è quello di implementare l'interfaccia 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 
} 

serializzazione il seguente esempio ...

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

restituirà il seguente xml:

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

si potrebbe desiderare di fare alcune convalide in modo che si codifica tag XML ecc

+1

Ah, mi hai mostrato il problema! Stavo usando 'WriteElementString (" Value ", _value)' invece di 'WriteString (_value)'. Ora il mio XML guarda come voglio io: ' Test' – Pakman

3

Hai risposto da solo. se si deriva da IXmlSerializable, è possibile modificare il metodo di fare esattamente (si spera) a ciò che desideri:

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

Questo codice produce: ' prova ' quando mi piacerebbe davvero: ' prova ' – Pakman

+1

modo, è possibile utilizzare al posto di WriteString WriteElementString :-). * edit * - appena visto qualcun altro ha detto la stessa :-( – itsho

Problemi correlati