将类的ToString()序列化为XmlElement

Pak*_*man 6 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<PropertyA>Value</PropertyA>
<ClassB />
Run Code Online (Sandbox Code Playgroud)

相反,我希望它是:

<PropertyA>Value</PropertyA>
<ClassB>Test</ClassB>
Run Code Online (Sandbox Code Playgroud)

......假设_value == "Test".我该怎么做呢?我必须在ClassB中提供公共财产_value吗?谢谢!

更新:

通过在ClassB中实现IXmlSerializable接口(此处显示为#12),生成以下XML:

<PropertyA>Value</PropertyA>
<ClassB>
    <Value>Test</Value>
</ClassB>
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*ter 4

正如您所指出的,执行此操作的唯一方法是实现 IXmlSerialized 接口。

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
}
Run Code Online (Sandbox Code Playgroud)

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

ClassB classB = new ClassB() { Value = "this class's value" };
Run Code Online (Sandbox Code Playgroud)

将返回以下 xml :

<?xml version="1.0" encoding="utf-16"?><ClassB>this class's value</ClassB>
Run Code Online (Sandbox Code Playgroud)

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