【问题标题】:Serialize list of child objects to root-level elements将子对象列表序列化为根级元素
【发布时间】:2019-09-30 15:35:42
【问题描述】:

我正在尝试将包含 List 的子对象的父对象序列化为 XML,该 XML 由一个父元素组成,每个子对象作为一个单独的元素。我希望在子类型被序列化的任何时候都适用,因此在子类型上实现IXmlSerializable 似乎很理想;但是,我还没有找到一个独立的解决方案。或者,可能向XmlSerializer 提供XmlAttributeOverrides?我不介意必须在 Parent 上添加属性,但想避免在 Parent 上进行任何 ISerializable 实现(因为我有许多类型可以引用 Child)。

示例类层次结构:

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" }
   }
};

应该序列化到:

<Parent>
  <Name>Test Parent</Name>
  <Alice>This is alice's value</Alice>
  <Bob>This is bob's value</Bob>
</Parent>

我在 Child 上创建了一个 IXmlSerializable 实现:

public void WriteXml(XmlWriter writer) {     
   writer.WriteElementString(Name, Value.ToString());
}

并在Children 上添加了[XmlElement]。 哪个正确序列化了孩子,但它仍然会嵌套在父级下太深一层,例如:

<Parent>
  <Children>
    <Alice>this is alice</Alice>
 </Children>
</Parent>

希望我错过了一些技巧。谢谢!

【问题讨论】:

  • 我建议你在这个方面看起来不同。你想删掉children的list元素,为什么要这样做?序列化已经很好了。这有意义吗?
  • [XmlElement] 应该在上面: public List Children { get;放; }
  • @Aldert 我正在与之交互的遗留系统的范围内工作。我需要以预期的格式编写 XML,但这些集合项将在运行时动态添加。
  • 好的,现在我明白你的局限性了..

标签: c# xml serialization


【解决方案1】:

the docs:

您提供的 WriteXml 实现应该写出对象的 XML 表示。 框架编写一个包装器元素并在 XML 编写器启动后定位。您的实现可能会编写其内容,包括子元素。 框架然后关闭包装元素。

因此,当序列化Parent 时,框架将编写Children,然后编写多个Child 元素,并在Child 上调用您的IXmlSerializable.WriteXml 实现,以便为每个元素编写它们的内容。 p>

如果您将[XmlElement] 添加到Children,那么它将写入多个Children 元素(因为这是属性的名称),然后为每个孩子调用您的实现。

考虑到它的工作原理,我不确定除了在 Parent 中实现 IXmlSerializable 之外您还有其他选择。

【讨论】:

  • 谢谢,我想了这么多,但希望某些属性可能对此有所帮助。看来我必须将其用于某种序列化工厂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 2011-09-24
  • 2016-12-22
相关资源
最近更新 更多