用于调试/检查XML序列化的工具

时间:2010-02-25 23:50:08

标签: c# xml serialization debugging

是否有任何工具可帮助调试/检查xml序列化过程?

例如,假设某个项目被标记为内部而非公共。没有编译时错误消息,也没有运行时错误消息。如果设置断点并进入序列化过程,则只是跳过该项。换句话说,通常很难找到这些类型的问题。 调试工具允许您逐步完成整个过程并提供一些反馈,例如:遇到这个属性,遍历属性并没有找到相应的公共属性,跳过。 另一种选择是检查所有具有xml序列化属性的类的检查工具,以确保它们可访问并具有设置方法等。

5 个答案:

答案 0 :(得分:10)

对于那些查看此问题的人,我发现为XmlSerializer的UnknownNode和UnknownAttribute事件添加事件处理程序非常有帮助。即使你只是让它抛出一个新的NotImplementedException,你也可以设置一个断点,看看何时遇到未知的节点和属性。

例如:

        public void Open(string filename)
        {

            // Create serializer
            XmlSerializer serializer = new XmlSerializer(typeof(ObjectType));

            // Set event handlers for unknown nodes/attributes
            serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode);
            serializer.UnknownAttribute += new  XmlAttributeEventHandler(serializer_UnknownAttribute);

...

        }

        private static void serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e)
        {
            throw new System.NotImplementedException();
        }

        private static void serializer_UnknownNode(object sender, XmlNodeEventArgs e)
        {
            throw new System.NotImplementedException();
        }

答案 1 :(得分:3)

测试这些类型问题(序列化不完整或不正确)的最简单方法是单元测试 - 没有什么复杂的。

  • 创建可序列化类型的对象
  • 设置所有属性
  • 序列化
  • 获取序列化输出并将其反序列化为新对象
  • 检查对象的所有属性以确保它们仍然填充
  • 如果任何属性未设置为预期值
  • ,则单元测试失败

请记住,这通常是您尝试证明的行为 - 而不是实施。检查特定属性的工具仅对测试代码的单个实现有价值:像上面这样的单元测试可以用于任何形式的序列化或存储,而无需重写测试。

答案 2 :(得分:1)

你是什么意思“一个项目”。如果类型是内部的,您应该会看到一条错误消息。 最外层的异常通常不是非常有用,但通过.InnerException向下追溯到底部,它通常会说明完全问题是什么。

如果一名成员完全内部,那么肯定 - 它将被跳过。

IMO,单元/集成测试在这里是你真正的朋友 - 序列化所需的输出最终编译器之外,所以如果输出你是否得到编译时消息并不重要与你的期望不符。我的意思是:进行序列化并与预期的输出文件进行比较。同上输入。

例如,尝试序列化:

[XmlRoot("Node", Namespace="http://flibble")]
public class MyType {
    [XmlElement("chileNode")]
    public string Value { get; internal set; }
}

给出(在运行时):

  

无法生成临时类(result = 1)。   错误CS0200:无法将属性或索引器“MyType.Value”分配给 - 它是只读的

非常具体。

答案 3 :(得分:0)

我不知道任何现有工具,但您可以使用反射扫描类。您可以使用反射来查看序列化程序生成的代码。

答案 4 :(得分:0)

您可以在此处使用MS Visual Studio环境中的SGen.exe工具。

通过在包含可serilizable类型的程序集上运行此工具,它会在名为“{original-library-name} .XmlSerializers.dll”的库中为您生成所有XMLSerializer版本。

根据文档,你必须将它作为命令行工具运行(可能是post-buildstep?),因为'project-options'中提供的选项“不是你期望它做的”。将其设置为“自动”或“开”将不会始终生成所需的装配。

运行此工具后,您现在拥有一个包含项目所有序列化程序的库。您现在可以使用此库来检查预期的序列化程序是否可用。

希望这有帮助,