【问题标题】:Custom XML Serialization, how to write custom root element?自定义 XML 序列化,如何编写自定义根元素?
【发布时间】:2010-03-15 23:43:45
【问题描述】:

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

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

例子:

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

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

我尝试将 XMLRoot 放到该类中,但我认为由于 vb 正在使用其 aspx 页面编译此部分类,它要么覆盖此属性,要么完全忽略它。

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

除了我还有其他人这样做吗?

谢谢

【问题讨论】:

  • "...正在用它的 aspx 页面编译这个部分类..." 你的意思是你正在序列化页面类吗?您可以编辑您的问题以向我们提供您尝试序列化的类的示例吗? XMLRoot 应该可以正常工作。

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


【解决方案1】:

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

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

【讨论】:

  • 完美!这行得通。我会做更多的实验,希望能找到一些关于 xml 序列化程序的好文献。再次感谢
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      或者您可以实现 IXmlSerializable 并完全控制您的 Xml,但只是为了更改根元素名称需要付出一些额外的努力。

      【讨论】:

      • 这就是我正在做的。只是生成的根元素不断出现。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2017-01-10
        • 1970-01-01
        • 2012-06-08
        • 1970-01-01
        • 2014-07-08
        • 2010-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多