.NET 4.8中如何序列化包含XML属性的对象并避免嵌套层级?
解决方案:使用
[XmlAnyElement]属性实现平级序列化 当然可以实现你想要的序列化效果!在.NET 4.8框架下,只需要给Stuff属性添加[XmlAnyElement]特性,就能让XElement的内容直接作为<RESULT>的子元素输出,而不会被包裹在<Stuff>标签里。
修改后的Result类代码
[XmlRoot(ElementName = "RESULT", Namespace = "", IsNullable = false)] public class Result { public string Message { get; set; } // 添加XmlAnyElement特性,告诉序列化器直接输出XElement的内容 [XmlAnyElement] public XElement Stuff { get; set; } public override string ToString() { var ser = new XmlSerializer(GetType()); using (var stream = new StringWriter()) { ser.Serialize(stream, this); return stream.ToString(); } } }
测试示例
// 解析已有XML为XElement var fooElement = XElement.Parse(@" <FOO> <BAR>Hello World</BAR> <BAR2>Hello World</BAR2> <BAR3>Hello World</BAR3> </FOO>"); // 创建Result实例并赋值 var result = new Result { Message = "Hello World", Stuff = fooElement }; // 序列化输出 Console.WriteLine(result.ToString());
输出结果
运行后你会得到完全符合需求的XML:
<?xml version="1.0" encoding="utf-16"?> <RESULT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Message>Hello World</Message> <FOO> <BAR>Hello World</BAR> <BAR2>Hello World</BAR2> <BAR3>Hello World</BAR3> </FOO> </RESULT>
可选:修改输出的节点名称
如果你想把<FOO>改成<Stuff>,只需要给[XmlAnyElement]指定名称参数即可:
[XmlAnyElement("Stuff")] public XElement Stuff { get; set; }
这样序列化后就会输出<Stuff>标签替代原来的<FOO>,完全满足你的备注需求。
内容的提问来源于stack exchange,提问作者Mister Magoo
相关产品推荐
相关产品推荐

