C# 将子对象列表序列化为根级元素
我试图将包含子对象的C# 将子对象列表序列化为根级元素,c#,xml,serialization,C#,Xml,Serialization,我试图将包含子对象的列表的父对象序列化为XML,该XML由父元素组成,每个子对象作为单独的元素。我希望在子类型被序列化的任何时候都能应用这种方法,因此在子类型上实现IXmlSerializable似乎是理想的;然而,我还没有找到一个完备的解决方案。或者,可能向XmlSerializer提供XmlAttributeOverrides?我不介意必须在父级上添加属性,但希望避免在父级上实现任何ISerializable(因为我有许多类型可以引用子级) 示例类层次结构: public class Par
列表的父对象序列化为XML,该XML由父元素组成,每个子对象作为单独的元素。我希望在子类型被序列化的任何时候都能应用这种方法,因此在子类型上实现IXmlSerializable
似乎是理想的;然而,我还没有找到一个完备的解决方案。或者,可能向XmlSerializer
提供XmlAttributeOverrides
?我不介意必须在父级上添加属性,但希望避免在父级上实现任何ISerializable(因为我有许多类型可以引用子级)
示例类层次结构:
public class Parent {
public string Name { get; set; }
public string SomeProperty { get; set; }
// ....
public List<Child> Children { get; set; }
}
public class Child {
public string Name { get; set; }
public string Value { get; set; }
}
var o = new Parent {
Name = "Test Parent",
Children = new List<Child> {
new Child { Name = "Alice", Value = "This is alice's value" },
new Child { Name = "Bob", Value = "This is bob's value" }
}
};
并在子项上添加了[xmlement]
。
正确序列化子级,但仍将嵌套在父级下太深的一级,例如:
<Parent>
<Children>
<Alice>this is alice</Alice>
</Children>
</Parent>
我是爱丽丝
希望我错过了一些技巧。谢谢 Per:
您提供的WriteXml实现应该写出对象的XML表示框架写入包装器元素,并在XML编写器启动后定位它。您的实现可以编写其内容,包括子元素然后框架关闭包装器元素。
因此,当序列化Parent
时,框架将写入Children
,然后写入多个Child
元素,调用IXmlSerializable.WriteXml
实现来写入它们的内容
如果将[XmlElement]
添加到子元素
,则它将写入多个子元素
元素(这是属性的名称),然后为每个子元素调用实现
考虑到这是如何工作的,除了在Parent
中实现IXmlSerializable
之外,我不确定您是否还有其他选择,我建议您在这方面有所不同。如果要删除儿童的列表元素,为什么要这样做?序列化已经很好了。这有意义吗?[XmlElement]应该在上面:public List Children{get;set;}@Aldert我在与之交互的遗留系统的范围内工作。我需要以预期的格式编写XML,但这些集合项将在运行时动态添加。好的,现在我理解了您的限制。谢谢,我也这么想了,但希望某些属性可能对此有所帮助。看来我得把它做成某种序列化工厂。
public void WriteXml(XmlWriter writer) {
writer.WriteElementString(Name, Value.ToString());
}
<Parent>
<Children>
<Alice>this is alice</Alice>
</Children>
</Parent>