自定义XML序列化,如何编写自定义根元素?

时间:2010-03-15 23:43:45

标签: c# .net vb.net xml-serialization

我可能只是做错了,我知道。

我正在使用自定义序列化,当生成xml时,它将类名作为根元素

示例:

<MyClassName>
 <MyIntendedRootNode>
   <ObjectType>
     <Property1/>
     <Property2/>
...

我正在通过调用xmlserializer.Serialize(writer,Me)调用序列化,所以我确信它与它有关。

我已经尝试将XMLRoot放到类中,但我认为当vb使用其aspx页面编译这个部分类时,它要么覆盖这个属性,要么完全忽略它。

理想情况下,我想告诉它要么扔掉它拥有的所有内容并使用不同的根元素。

除了我以外,其他人都这样做吗?

由于

5 个答案:

答案 0 :(得分:3)

您可以使用IXmlSerializable或使用XML属性。我使用XmlSerializer在构造函数中传递root。

var MemoryStream ms;
var customRoot = dataObject as XmlRootAttribute;
var xml = new XmlSerializer(dataObject.GetType(), customRoot);
xml.Serialize(ms, dataObject);

答案 1 :(得分:1)

在ASP.NET中,加载的实际类是从类继承的生成类。 (事实证明 - 令人惊讶的是 - 这个生成的代码实际上与使用部分类技术与您的代码组合的其他生成代码分开。生成的类与您正在处理的类具有相同的名称,但它在XmlRoot不是继承属性,XmlSerializer没有看到它。

我认为没有任何解决方案(除了在生成文档后修改文档)。

答案 2 :(得分:1)

您是否尝试序列化代码隐藏文件?

我建议编写一个模型来包含需要保存的数据,然后将其序列化。然后使用适当的XMLWriter属性确保您的根元素正确命名。

答案 3 :(得分:1)

或者您可以实现IXmlSerializable并完全控制您的Xml,但只需更改根元素名称就可以做一些额外的工作。

答案 4 :(得分:0)

您可以创建一个包装类,并为该包装类提供您希望在xml根目录中显示的名称。