我正在尝试调查故障转储中的错误(因此无法更改代码)。我有一个非常复杂的对象(序列化表示中的数千行),并且其状态不一致。要调查其状态,Visual Studio调试器视图是无用的。但是对象具有数据合同。我想序列化它,然后使用我最喜欢的文本编辑器在对象上导航。是否可以通过调试器执行?
我正在尝试调查故障转储中的错误(因此无法更改代码)。我有一个非常复杂的对象(序列化表示中的数千行),并且其状态不一致。要调查其状态,Visual Studio调试器视图是无用的。但是对象具有数据合同。我想序列化它,然后使用我最喜欢的文本编辑器在对象上导航。是否可以通过调试器执行?
Answers:
不久前,我写了这个单行代码,将对象序列化为磁盘上的文件。将其复制/粘贴到“即时”窗口中,然后obj
用您的对象替换(两次引用)。它将保存一个text.xml
文件c:\temp
,根据您的喜好进行更改。
(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)
不过,不要指望任何魔术,如果对象无法序列化,它将引发异常。
identifier "System" is undefined
运气好的话,您的appdomain中已经有了Json.Net。在这种情况下,将其弹出到“立即”窗口中:
Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
这是一个Visual Studio扩展,它将使您能够准确地做到这一点:
https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f
您可以输出到JSON,XML或C#
我有一种扩展方法:
public static void ToSerializedObjectForDebugging(this object o, FileInfo saveTo)
{
Type t = o.GetType();
XmlSerializer s = new XmlSerializer(t);
using (FileStream fs = saveTo.Create())
{
s.Serialize(fs, o);
}
}
我用saveTo的字符串重载了它,并从立即窗口中调用它:
public static void ToSerializedObjectForDebugging(this object o, string saveTo)
{
ToSerializedObjectForDebugging(o, new FileInfo(saveTo));
}
来自Omar Elabd的答案的变体-
它不是免费的,但是有OzCode的免费试用版
(https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode)。
在那里的上下文/悬停菜单中内置了到JSON的导出功能,它比Object Export扩展更好(它不是免费的)。
http://o.oz-code.com/features#export(演示)
我知道事实已经过了几年了,但是我在这里留下答案,因为这对我有用,其他人可能会觉得有用。
我一直在使用ObjectDumper.Net。
它运作良好,尤其是在进行实时单元测试的情况下。运行测试时,我可以轻松地在控制台中查看变量的值,从而免除了手动调试的麻烦。
如果您使用的是XUnit,这可能会有所帮助。
阿列克谢答案的变化。稍微复杂一点,但是不涉及写入文本文件:
1)在立即窗口中输入:
System.IO.StringWriter stringWriter = new System.IO.StringWriter();
2)在“监视”窗口中输入两个监视:
a. stringWriter
b. new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(stringWriter, obj)
输入第二个监视(“序列化”监视)后,stringWriter监视值将设置为obj,序列化为XML。复制并粘贴。请注意,XML将用大括号{...}括起来,因此,如果要将XML用于任何内容,则需要将其删除。