将DTO(在调试器中)转换为XML
本文关键字:转换 XML 调试器 DTO | 更新日期: 2023-09-27 18:02:03
我经常使用实际数据对我的服务进行测试。Visual Studio 2015是否有一些扩展来帮助将调试器中的数据传输对象转换为XML或JSON表示(供以后在单元测试中使用)?当然,我可以在某个执行点通过一些序列化代码来实现这一点,但这是一个肮脏的解决方案,需要重新编译(在我的情况下,这可能需要10分钟)。
不确定插件或扩展,但是当所有这些都失败时,您可以使用即时窗口生成所需的输出,如果需要,为中间结果定义临时全局变量。
示例1:当Newtonsoft.Json.dll
不是已经链接到您的项目时生成JSON输出
假设你想为一个对象生成JSON, json.net没有链接到你当前的项目中,但已经下载到你的机器上。您仍然可以使用它来生成输出到即时窗口,如下所示:
-
加载Newtonsoft DLL,在提示符下输入
Assembly.LoadFrom(...)
,并选择合适的路径:System.Reflection.Assembly.LoadFrom(Environment.ExpandEnvironmentVariables(@"%USERPROFILE%'Documents'Visual Studio 2015'Projects'Json90r1'Bin'Net45'Newtonsoft.Json.dll"));
-
现在你将能够调用
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字符串;所有的序列化方法都采用某种Stream
或Writer
。
您可以通过在Immediate窗口中定义临时全局变量来保存中间对象(在本例中为编写器和设置),并将其序列化为这些对象来处理缺乏适当的API的问题:
-
再次打开即时窗口
-
在即时窗口中,通过输入以下命令定义临时全局
StringBuilder
和XmlWriterSettings
:System.Text.StringBuilder _sb = new System.Text.StringBuilder(); System.Xml.XmlWriterSettings _settings = new System.Xml.XmlWriterSettings(); _settings.Indent = true;
-
将
打印结果: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分钟重新构建要快。从一些已保存的文本文件或注释中复制/粘贴也使两者更快。