使用默认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。
还有其他想法吗?
您通常不会使用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类,你也可以选择你想要序列化对象的方式-使用XmlSerializer
或DataContractSerializer
(我想说这给了你更好的灵活性)
注意:你可以使用一些工具从你的xml生成xsd,如果你没有一个,不知道如何写在自己的
您可以使用XmlRootAttribute
来指定自定义XML根
同样,当序列化集合时,您可以指定包装器-参见数组序列化