C# XML 序列化 - 动态元素名称

Ksi*_*ice 3 c# xml xml-serialization

我当前的 XML 结构是:

<Parent>
 <Child>
   <Line id="1">Something</Line>
   <Line id="2">Something</Line>
 </Child>
 <Child>
   <Line id="1">Something else</Line>
   <Line id="2">Something else</Line>
 </Child>
</Parent>
Run Code Online (Sandbox Code Playgroud)

父类代码包含属性:

[XmlElement("Child")]
public List<Child> Childrens { get; set; }
Run Code Online (Sandbox Code Playgroud)

现在我希望将其更改为:

<Parent>
 <Child>
   <Line id="1">Something</Line>
   <Line id="2">Something</Line>
 </Child>
 <SpecialChild>
   <Line id="1">Some other text</Line>
   <Line id="2">Some other text</Line>
 </SpecialChild>
</Parent>
Run Code Online (Sandbox Code Playgroud)

即当 Child 设置了一些特殊标志时,应该更改它的名称,并打印一些其他文本。孩子已经知道根据标志打印什么文本。

但现在更改元素名称的最佳选择是什么?

Mar*_*ell 5

认为你应该能够为此使用继承:

[XmlElement("Child", typeof(Child))]
[XmlElement("SpecialChild", typeof(SpecialChild))]
public List<Child> Childrens { get; set; }
Run Code Online (Sandbox Code Playgroud)

public class SpecialChild : Child {...}
Run Code Online (Sandbox Code Playgroud)

但是:如果没有继承,它本身就不受支持,您需要执行手动序列化。


编辑:已确认,工作正常:

using System;
using System.Collections.Generic;
using System.Xml.Serialization;
class Program
{    static void Main()
    {
        var ser = new XmlSerializer(typeof(Parent));
        var obj = new Parent
        {
            Childrens = {
                new Child { },
                new SpecialChild { },
            }
        };
        ser.Serialize(Console.Out, obj);
    }
}
public class Parent
{
    [XmlElement("Child", typeof(Child))]
    [XmlElement("SpecialChild", typeof(SpecialChild))]
    public List<Child> Childrens { get; } = new List<Child>();
}
public class Child { }
public class SpecialChild : Child { }
Run Code Online (Sandbox Code Playgroud)