将类的ToString()序列化为XmlElement

时间:2010-10-01 21:26:40

标签: c# xml-serialization

在C#中,我正在尝试将ClassA序列化为XML:

[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;
    }
}

不幸的是,序列化的结果是:

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

相反,我希望它是:

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

...假设_value == "Test"。我该怎么做呢?我在ClassB中为_value提供公共属性吗?谢谢!

更新

通过在ClassB(shown here#12)中实现IXmlSerializable接口,生成以下XML:

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

这个解决方案几乎可以接受,但摆脱标签会很好。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

你已经回答了自己。 如果你从IXmlSerializable派生,你可以改变方法(希望)你想做的事情:

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

答案 1 :(得分:3)

正如您所指出的,唯一的方法是实现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
}

序列化以下实例......

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

将返回以下xml:

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

您可能需要进行一些验证,以便对xml标记等进行编码。