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>