在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>
这个解决方案几乎可以接受,但摆脱标签会很好。有什么想法吗?
答案 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标记等进行编码。