Visual Studio how to serialize object from debugger

I'm trying to investigate a bug in a crash dump (so I can not change the code). I have a really complicated object (thousands of lines in the serialized representation) and its state is inconsistent. To investigate its state the Visual Studio debugger view is useless. But the object has a data contract. I'd like to serialize it and then use my favorite text editor to navigate across the object. Is it possible to do the from the debugger?

61501 次浏览

可以使用即时窗口对其进行序列化,然后将内容复制到您喜欢的编辑器中。

另一种选择是重写 ToString()方法,并在调试模式下调用它。

You can also write the contents out to a file shortly before the crash, or wrap the code into a try/catch and write the file then. I'm assuming you can identify when it's crashing.

我有一个扩展方法:

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));
}

运气好的话,你的应用程序域名里已经有了 Json.Net。如果是这样的话,把这个弹出到你的即时窗口:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)

这里有一个 VisualStudio 扩展,可以让你完全做到这一点:

Https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f

您可以输出到 JSON、 XML 或 C #

不久前,我编写了这个一行程序,将一个对象序列化到磁盘上的一个文件中。将它复制/粘贴到即时窗口,并用对象替换 obj(它被引用了两次)。它将保存一个 text.xml文件到 c:\temp,改变它到您的喜好。

(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)

但是不要期望任何魔术,如果对象不能序列化,它会抛出异常。

阿列克谢回答的一个变体,稍微复杂一点,但不包括写到一个文本文件:

1)在即时视窗输入:

System.IO.StringWriter stringWriter = new System.IO.StringWriter();

2)在“表窗”中输入两块表:

a.  stringWriter


b.  new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(stringWriter, obj)

输入第二个手表(Serialize)后,stringWriter 手表值将被设置为序列化为 XML 的 obj。复制粘贴。请注意,XML 将被括在花括号中,{ ... } ,因此如果您希望将 XML 用于任何用途,就需要删除它们。

奥马尔 · 埃拉布德的答案的变体

不是免费的,但是 OzCode 有免费试用版
(https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode).

在上下文/悬停菜单中有内置的 JSON 导出功能,它比 Object Export 扩展工作得更好一些(因为它不是免费的)。

Http://o.oz-code.com/features#export

我知道这已经是几年前的事了,但是我在这里留下一个答案,因为这对我有用,而且其他人可能会发现它有用。

如果你有一个循环引用,在直接窗口中运行它:

Newtonsoft.Json.JsonConvert.SerializeObject(app, Newtonsoft.Json.Formatting.Indented,
new Newtonsoft.Json.JsonSerializerSettings
{
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize
});

我一直在用 ObjectDumper.Net

It works well, especially if you have live unit testing. I can easily view a variable's value in the console when a test runs, saving me from debugging manually.

如果您正在使用 XUnit,这个 可能会有所帮助。

在 Visual Studio 的“即时”窗口中使用这个命令,将 c:\directory\file.json替换为您希望将 JSON 和 myObject写入到的文件的完整路径,并将变量序列化:

System.IO.File.WriteAllText(@"c:\directory\file.json", Newtonsoft.Json.JsonConvert.SerializeObject(myObject))

由于 .NET Core 3.0 你可以使用 System.Text.Json:

System.Text.Json.JsonSerializer.Serialize(obj)