在序列化对象时,是否还要在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。组包含组,组包含子组。
还有其他想法吗?
答案 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类,您也可以选择要序列化的方式对象 - 使用XmlSerializer
或DataContractSerializer
(这会给你更好的灵活性)
注意:你可以使用一些工具从你的xml生成xsd,如果你没有xsd并且不知道如何自己编写它
您可以使用XmlRootAttribute
来指定自定义XML Root
同样,在序列化集合时,您可以指定包装器 - 请参阅Array Serializing