是否有任何工具可以帮助调试/检查xml序列化过程?
例如,假设一个项目被标记为内部而不是公共。没有编译时错误消息,也没有运行时错误消息。如果设置断点并进入序列化过程,则只是跳过该项。换句话说,通常很难找到这些类型的问题。 调试工具允许您逐步完成整个过程并提供一些反馈,例如:遇到这个属性,遍历属性并没有找到相应的公共属性,跳过。 另一个选项是检查所有具有xml序列化属性的类的检查工具,以确保它们可访问并具有设置方法等。
是否有任何工具可以帮助调试/检查xml序列化过程?
例如,假设一个项目被标记为内部而不是公共。没有编译时错误消息,也没有运行时错误消息。如果设置断点并进入序列化过程,则只是跳过该项。换句话说,通常很难找到这些类型的问题。 调试工具允许您逐步完成整个过程并提供一些反馈,例如:遇到这个属性,遍历属性并没有找到相应的公共属性,跳过。 另一个选项是检查所有具有xml序列化属性的类的检查工具,以确保它们可访问并具有设置方法等。
对于那些查看这个问题的人,我发现为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();
}
测试这些类型问题(序列化不完整或不正确)的最简单方法是单元测试 - 没有什么复杂的。
请记住,这通常是您试图证明的行为 - 而不是实施。检查特定属性的工具仅对测试代码的单个实现有价值:像上面这样的单元测试可以用于任何形式的序列化或存储而无需重写测试。
你是什么意思“一个项目”。如果一个 类型 是内部的,您应该看到一条错误消息。该 最 异常通常不是很有帮助,但追溯通过 .InnerException
到底部,它通常会拼出来 究竟 问题是什么。
如果是会员 完全 内部,然后肯定 - 它将被跳过。
IMO,单元/集成测试是你真正的朋友 - 序列化所需的输出最终 外 编译器,因此如果输出与您期望的不匹配,是否获得编译时消息并不重要。我的意思是:进行序列化并与预期的输出文件进行比较。同上输入。
例如,尝试序列化:
[XmlRoot("Node", Namespace="http://flibble")]
public class MyType {
[XmlElement("chileNode")]
public string Value { get; internal set; }
}
给出(在运行时):
无法生成临时类(result = 1)。 错误CS0200:无法将属性或索引器“MyType.Value”分配给 - 它是只读的
这是非常具体的。
我不知道任何现有工具,但您可以使用反射扫描类。您可以使用反射来查看序列化程序生成的代码。
你可以在这里做的是利用MS Visual Studio环境中的SGen.exe工具。
通过在包含可serilizable类型的程序集上运行此工具,它会在名为“{original-library-name} .XmlSerializers.dll”的库中为您生成所有XMLSerializer版本。
根据文档,你必须将它作为命令行工具运行(可能是post-buildstep?),因为'project-options'中提供的选项“不是你期望它做的”。将其转换为“自动”或“开”将不会始终生成所需的装配。
运行此工具后,您现在拥有一个包含项目所有序列化程序的库。您现在可以使用此库来检查预期的序列化程序是否可用。
希望这可以帮助,