我如何在 C# 中为我的 class 实现以下 XmlSerializer 更改?

How would I achieve the following XmlSerializer change for my class in C#?

我想制作以下内容XML:

<Base>
    <Child>
        <Name>Joe</Name>
    </Child>
    <Child>
        <Name>Jack</Name>
    </Child>
</Base>

来自类:

public class Base
{
    public List<Child> children;
    ...elided...
}

public class Child
{
    public string Name;
    ...elided...
}

现在,它正在创建:

<Base>
    <children>
        <Child>
            <Name>Joe</Name>
        </Child>
        <Child>
            <Name>Jack</Name>
        </Child>
    </children>
</Base>

我将如何更改以产生所需的输出?

我当前的代码:

XmlSerializer serializer = new XmlSerializer(base.GetType());
serializer.serialze(stringWriter, base);
return stringWriter.ToString();

编辑:其他解决方案更好、更直接地回答了您的问题。但是,我将把它留在这里,因为在某些情况下扩展 List<> 而不是包含 public List 成员可能是个好主意。这是可能的解决方案。

好吧,您可以实施 IXmlSerializable,但这对于您想要做的事情来说可能有点过头了。或者,您可以使 Base 扩展 List.

public class Base : List<Child>
{
}

这当然会改变您在其余代码中引用子项的方式。如果你有 base.children[0],你会改用 base[0].

您可以按如下方式使用 XmlElementAttribute:

public class Base
{
    [XmlElement("Child")]
    public List<Child> children;
    ...elided...
}

public class Child
{
    public string Name;
    ...elided...
}

使用XmlElementAttribute

public class Base
{
    [XmlElement(ElementName = "Child")]
    public List<Child> children;
}

...完整示例...

using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml.Serialization;

class Program
{
    static void Main()
    {
        var xsr = new XmlSerializer(typeof(Base));

        var b = new Base
        {
            children = new List<Child>
                {
                    new Child { Name= "Joe"},
                    new Child { Name ="Jack"},
                }
        };
        using (var ms = new MemoryStream())
        {
            xsr.Serialize(ms, b);

            var str = Encoding.UTF8.GetString(ms.ToArray());
            /*
            <?xml version="1.0"?>
            <Base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
              <Child>
                <Name>Joe</Name>
              </Child>
              <Child>
                <Name>Jack</Name>
              </Child>
            </Base>
             */
        }
    }
}

public class Base
{
    [XmlElement("Child")]
    public List<Child> children;
}

public class Child
{
    public string Name;
}