【问题标题】:Tools for debugging / checking XML Serialization [closed]用于调试/检查 XML 序列化的工具 [关闭]
【发布时间】:2011-01-21 06:20:24
【问题描述】:

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

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

【问题讨论】:

  • FWIW,如果您愿意,您可以调试到 .NET 源代码(可以在某处下载,在执行之前阅读许可证)。如果你想看看它是如何运作的,这就是我的建议。

标签: c# xml serialization debugging


【解决方案1】:

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

【讨论】:

  • 这真的很有用。您应该将此标记为正确答案,因为这是调试 XmlSerializer 的唯一方法。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    你是什么意思“一个项目”。如果 type 是内部的,您应该会看到一条错误消息。 最外层异常通常不是很有帮助,但通过.InnerException 一直追踪到底部,它通常准确说明问题所在。

    如果一个成员是完全内部的,那么当然 - 它将被跳过。

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

    例如尝试序列化:

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

    给出(在运行时):

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

    这是非常具体的。

    【讨论】:

    • 例如,集合设置为 internal 且类型设置为 internal 的对象集合不会在集合上的 xmlarray 属性和对象类型上的 xmltype 生成编译时或运行时错误.当您将 ObjectType 设置为 internal 时会生成编译时错误消息,但这是因为集合的访问权限比类型更有限。作为另一个示例,使用 XmlAttribute 属性设置为 internal 的访问器也不会生成错误。此外,尽管这很明显,但缺少集合;方法不会导致错误。
    • 只是为了澄清:这是假设 xml 文件格式正确。那是另一个问题。在处理格式不正确的 xml 之前,我必须让代码正确处理正确格式化的 xml!
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      您必须将其作为命令行工具运行(可能是构建后步骤?),因为根据文档,“项目选项”中可用的选项“不是您期望的”。将此设置为 Auto 或 On 并不总是会生成您需要的程序集。

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

      希望这会有所帮助,

      【讨论】:

        猜你喜欢
        • 2010-11-28
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多