问题 用于调试/检查XML序列化的工具[关闭]


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

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


9037
2018-02-25 23:50


起源

蒂姆,继续以你现在的方式调试,你几个月内就不需要这样的工具了。 - John Saunders
FWIW,你可以根据需要调试.NET源代码(可以在某处下载,在执行之前阅读许可证)。如果你想看看它是如何运作的话,这就是我所建议的。 - Noon Silk


答案:


对于那些查看这个问题的人,我发现为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();
        }

6
2018-02-09 01:29



这真的很有用。您应该将此标记为正确答案,因为这是调试XmlSerializer的唯一方法。 - Joan.bdm


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

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

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


3
2018-03-04 10:16





你是什​​么意思“一个项目”。如果一个 类型 是内部的,您应该看到一条错误消息。该  异常通常不是很有帮助,但追溯通过 .InnerException 到底部,它通常会拼出来 究竟 问题是什么。

如果是会员 完全 内部,然后肯定 - 它将被跳过。

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

例如,尝试序列化:

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

给出(在运行时):

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

这是非常具体的。


1
2018-02-26 06:27



例如,集合设置为internal且类型设置为internal的对象集合不会使用集合上的xmlarray属性和对象类型上的xmltype生成编译时或运行时错误。只需将ObjectType设置为internal,就会生成编译时错误消息,但这是因为集合的访问权限比类型更有限。作为另一个示例,使用XmlAttribute属性设置为内部的访问器也不会生成错误。此外,虽然这是显而易见的,但缺少一套;方法不会导致错误。 - Tim
只是为了澄清:这是假设xml文件格式正确。这是另一个问题。在我可以处理格式不正确的xml之前,我必须让代码正确处理格式化xml! - Tim


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


0
2018-02-26 07:50





你可以在这里做的是利用MS Visual Studio环境中的SGen.exe工具。

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

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

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

希望这可以帮助,


0
2018-02-27 01:10