XmlSerializer使用默认的XmlRoot进行序列化

时间:2011-12-14 19:46:06

标签: c# .net xml xml-serialization

在序列化对象时,是否还要在XmlSerializer中添加XML根元素或“Wrapper”?

我正在寻找的XML将是这样的:

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

我有两个类,Group和SubGroup。组包含子组的通用列表。它工作得很好,但我没有XML Root“Groups”。使用Group和SubGroup这两个类产生:

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

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

还有其他想法吗?

2 个答案:

答案 0 :(得分:4)

您通常不使用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个或更多。老实说,除非你真的想要序列化集合,否则我没有看到这么做的重点。这只会增加混乱。

答案 1 :(得分:0)

编辑:如果你真的想遵守供应商架构,那么你就是从错误的角度出发。 您根本不需要实现这样的类,而是采用供应商XSD并使用Visual Studio提供的xsd utility从模式生成.net类,您也可以选择要序列化的方式对象 - 使用XmlSerializerDataContractSerializer(这会给你更好的灵活性)

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

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

同样,在序列化集合时,您可以指定包装器 - 请参阅Array Serializing