我正在尝试调查一个崩溃转储文件中的错误(因此无法更改代码)。我有一个非常复杂的对象(序列化表示中有数千行),它的状态不一致。为了调查其状态,Visual Studio调试器视图无用。但该对象有一个数据契约。我想将其序列化,然后使用我喜欢的文本编辑器浏览整个对象。是否可以在调试器中完成这个操作?
我正在尝试调查一个崩溃转储文件中的错误(因此无法更改代码)。我有一个非常复杂的对象(序列化表示中有数千行),它的状态不一致。为了调查其状态,Visual Studio调试器视图无用。但该对象有一个数据契约。我想将其序列化,然后使用我喜欢的文本编辑器浏览整个对象。是否可以在调试器中完成这个操作?
如果你的应用程序域中已经存在 Json.Net,那么请将以下代码粘贴到你的立即窗口中:
Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
前段时间我写了这个一行代码,将对象序列化到磁盘上的文件中。将它复制/粘贴到你的Immediate窗口,并用你的对象替换obj
(它被引用两次)。它会保存一个text.xml
文件到c:\temp
,根据你的需要进行更改。
(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)
不要期望任何奇迹,如果对象无法被序列化,它会抛出异常。
标识符“System”未定义
。 - Rasoul自从 .NET Core 3.0
版本,你可以使用 System.Text.Json
:
System.Text.Json.JsonSerializer.Serialize(obj)
c:\directory\file.json
替换为您想要写入JSON的文件的完整路径,将myObject
替换为您要序列化的变量:System.IO.File.WriteAllText(@"c:\directory\file.json", Newtonsoft.Json.JsonConvert.SerializeObject(myObject))
Object Dumper是一个免费且开源的扩展程序,适用于Visual Studio和Visual Studio Code。
在代码和立即窗口中,"Dump as"命令可通过上下文菜单使用。
它可以将对象导出为:
我相信,结合Diff工具,这个工具会很有帮助。
我是这个工具的作者。
我有一个常用的扩展方法:
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));
}
你可以使用即时窗口对其进行序列化,然后将内容复制到你喜欢的编辑器中。
另一个选择是覆盖ToString()
方法,并在调试模式下调用它。
你也可以在崩溃前不久将内容写入文件,或将代码包装成try/catch并在那时写入文件。我假设你能够确定何时出现崩溃。
如果你遇到了循环引用的问题,请在立即窗口中运行以下代码:
最初的回答
Newtonsoft.Json.JsonConvert.SerializeObject(app, Newtonsoft.Json.Formatting.Indented,
new Newtonsoft.Json.JsonSerializerSettings
{
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize
});