使用默认XmlRoot进行序列化

本文关键字:序列化 XmlRoot 默认 | 更新日期: 2023-09-27 18:17:48

是否在序列化对象时在XmlSerializer中添加XML根元素或"包装器"?

我正在寻找的XML应该是这样的:

<Groups>
    <Group method="ModifySubGroups" ID="1234" PIN="5678">
        <SubGroup action="Delete" number="95">
            <Name>Test</Name>
        </SubGroup>
    </Group>
</Groups>

我有两个类,Group和SubGroup。Group包含子组的通用列表。它工作得很好,但我没有XML根"组"。使用两个类Group和SubGroup生成如下:

<Group method="ModifySubGroups" ID="1234" PIN="5678">
   <SubGroup action="Delete" number="95">
       <Name>Test</Name>
   </SubGroup>
</Group>

我能让它工作的唯一方法是创建另一个类"Groups"包含Group。现在我有三个类,Groups, Group和SubGroup。Groups包含Group, Group包含SubGroup。

还有其他想法吗?

使用默认XmlRoot进行序列化

您通常不会使用XML序列化来使XML美观。如果你需要一个根容器元素,那么你需要有一个根容器对象,并序列化它而不是Group对象。

你可以序列化一个Group对象数组

void Main()
{
    var g = new Group();
    g.SubGroups.Add(new SubGroup {Name = "aaa"});
    var ser = new XmlSerializer(typeof(Group[]), new XmlRootAttribute("Groups"));
    using (var w = new StringWriter())
    {
        ser.Serialize(w, new Group[] {g});
        w.ToString().Dump();
    }
}
public class Group
{
    [XmlElement("SubGroup")]
    public List<SubGroup> SubGroups = new List<SubGroup>();
}
public class SubGroup
{
    public string Name;
}

自然地,这意味着反序列化代码需要神奇地知道总是有且只有一个Group元素,或者假设可以有0个或更多。老实说,我不认为这样做有什么意义,除非你真的想序列化组集合。

编辑:如果你真的想遵守供应商的模式,你从错误的地方开始。你根本不需要实现这样的类,你所要做的就是使用XSD工具从你的模式中生成。net类,你也可以选择你想要序列化对象的方式-使用XmlSerializerDataContractSerializer(我想说这给了你更好的灵活性)

注意:你可以使用一些工具从你的xml生成xsd,如果你没有一个,不知道如何写在自己的

您可以使用XmlRootAttribute来指定自定义XML根

同样,当序列化集合时,您可以指定包装器-参见数组序列化