如何序列化XML中的对象,同时扁平化内部属性层次结构
本文关键字:扁平化 内部 层次结构 属性 对象 序列化 XML | 更新日期: 2023-09-27 18:12:56
我正在使用XmlSerializer序列化一个对象,在我的对象中指定属性以向XmlSerializer发出指令,如下所示:
[XmlType("FooElement")]
public class Foo {
[XmlAttribute("Type")]
public string fooType;
[XmlElement("Name")]
public string Name;
[XmlElement("Bar")]
public Bar BarObject;
}
public class Bar {
[XmlElement("Message")]
public string BarString;
[XmlElement("From")]
public string FromName;
}
当序列化Foo类型的对象时,生成以下XML:
<Foo Type="TypeName">
<Name>Name of Foo</Name>
<Bar>
<Message>5:00 Somewhere</Message>
<From>Jane Smith</From>
</Bar>
</Foo>
我想要的是将Foo中的所有数据平铺到相同的级别,如下所示:
<Foo Type="TypeName">
<Name>Name of Foo</Name>
<Message>5:00 Somewhere</Message>
<From>Jane Smith</From>
</Foo>
Foo和Bar保持独立的类对我的需求很重要。除了合并类之外,如何在序列化为XML时将Foo的元素扁平化为单个级别?如果可以通过使用[Property]标签来完成,那将是最好的。我愿意改变我的XML序列化方法。
编辑:我已经切换到XmlWriter类。这将允许我在我正在寻找的层次结构中编写XML元素。这里生成的使用XML的程序比c# XML工具简单得多。较简单的解析器在处理XmlSerializer生成的XML时遇到困难。应该可以了
void Main()
{
var foo = new Foo
{
Name = "name",
fooType = "type",
BarObject = new Bar { BarString = "bar"}
};
var s = new XmlSerializer(typeof(Foo));
using (var writer = new StringWriter())
{
s.Serialize(writer, foo);
writer.ToString().Dump();
}
}
public class Foo {
[XmlAttribute("Type")]
public string fooType;
[XmlElement("Name")]
public string Name;
[XmlElement("Message")]
public Bar BarObject;
}
public class Bar {
[XmlText]
public string BarString;
}
输出为:
<?xml version="1.0" encoding="utf-16"?>
<Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Type="type">
<Name>name</Name>
<Message>bar</Message>
</Foo>
我不知道有一种方法可以做到这一点,而不添加属性到Foo映射到Bar的相应属性。例如:
[XmlType("FooElement")]
public class Foo {
[XmlAttribute("Type")]
public string fooType;
[XmlElement("Name")]
public string Name;
[XmlIgnore()]
public Bar BarObject;
[XmlElement("Message")]
public string BarMessage
{
get {
return this.Bar.BarString;
}
set {
this.Bar.BarString = value;
}
}
public class Bar {
public string BarString;
}