将DTO(在调试器中)转换为XML

本文关键字:转换 XML 调试器 DTO | 更新日期: 2023-09-27 18:02:03

我经常使用实际数据对我的服务进行测试。Visual Studio 2015是否有一些扩展来帮助将调试器中的数据传输对象转换为XML或JSON表示(供以后在单元测试中使用)?当然,我可以在某个执行点通过一些序列化代码来实现这一点,但这是一个肮脏的解决方案,需要重新编译(在我的情况下,这可能需要10分钟)。

将DTO(在调试器中)转换为XML

不确定插件或扩展,但是当所有这些都失败时,您可以使用即时窗口生成所需的输出,如果需要,为中间结果定义临时全局变量。

示例1:当Newtonsoft.Json.dll 不是已经链接到您的项目时生成JSON输出

假设你想为一个对象生成JSON, json.net没有链接到你当前的项目中,但已经下载到你的机器上。您仍然可以使用它来生成输出到即时窗口,如下所示:

  1. 加载Newtonsoft DLL,在提示符下输入Assembly.LoadFrom(...),并选择合适的路径:

    System.Reflection.Assembly.LoadFrom(Environment.ExpandEnvironmentVariables(@"%USERPROFILE%'Documents'Visual Studio 2015'Projects'Json90r1'Bin'Net45'Newtonsoft.Json.dll"));
    
  2. 现在你将能够调用JsonConvert.SerializeObject()从即时窗口提示符,只要你使用完全限定的名称。例如,如果obj是一个您希望看到JSON的变量,您可以输入:

    System.Diagnostics.Debug.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented))
    

    调试输出现在将不转义地出现在直接窗口中。

扩展此技巧,您可以创建一个包含单个公共静态方法My.Debug.Write(object o)的小DLL,该方法可以将对象转储为您想要的任何格式,然后将该DLL保存到开发机器上的方便位置,例如"c:'My.DLL"。然后,在调试时,您可以加载DLL并调用调试输出方法,而无需输入更少的内容。

例2:直接使用XmlSerializer

说你想能够使用XmlSerializer生成XML,但不幸的是没有覆盖返回XML字符串;所有的序列化方法都采用某种StreamWriter

您可以通过在Immediate窗口中定义临时全局变量来保存中间对象(在本例中为编写器和设置),并将其序列化为这些对象来处理缺乏适当的API的问题:

  1. 再次打开即时窗口

  2. 在即时窗口中,通过输入以下命令定义临时全局StringBuilderXmlWriterSettings:

    System.Text.StringBuilder _sb = new System.Text.StringBuilder();
    System.Xml.XmlWriterSettings _settings = new System.Xml.XmlWriterSettings();
    _settings.Indent = true;
    
  3. obj序列化为StringBuilder,并通过输入

    打印结果:
    _sb.Length = 0;
    new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(System.Xml.XmlWriter.Create(new System.IO.StringWriter(_sb), _settings), obj);
    System.Diagnostics.Debug.WriteLine(_sb);
    

这两种技巧都需要一些输入,但都比等待10分钟重新构建要快。从一些已保存的文本文件或注释中复制/粘贴也使两者更快。