我正在尝试调查崩溃转储中的错误(因此我无法更改代码)。 我有一个非常复杂的对象(序列化表示中有数千行),并且它的状态不一致。要调查其状态,Visual Studio调试器视图是无用的。但该对象有一个数据契约。我想序列化它,然后使用我喜欢的文本编辑器浏览对象。是否可以从调试器中执行此操作?
答案 0 :(得分:109)
运气好的话,你已经在appdomain中拥有了Json.Net。在这种情况下,将其弹出到您的立即窗口:
Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
答案 1 :(得分:60)
前段时间我写了一个单行程序,将一个对象序列化到磁盘上的文件中。将其复制/粘贴到Intermediate窗口,并用您的对象替换obj
(它引用了两次)。它会将text.xml文件保存到c:\ temp,根据自己的喜好进行更改。
(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)
不要指望任何魔法,如果对象无法序列化,它将通过异常。
答案 2 :(得分:31)
这是一个Visual Studio扩展,它可以让你做到这一点:
https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f
您可以输出到JSON,XML或C#
答案 3 :(得分:6)
由于 .NET Core 3.0
,您可以使用 System.Text.Json
:
System.Text.Json.JsonSerializer.Serialize(obj)
答案 4 :(得分:3)
可以使用中间窗口对其进行序列化,然后将内容复制到您喜欢的编辑器中。
另一种选择是覆盖ToString()方法并在调试模式下调用它。
您还可以在崩溃前不久将内容写入文件,或者将代码包装到try / catch中然后编写文件。我假设你可以确定它什么时候崩溃。
答案 5 :(得分:3)
我有一个使用的扩展方法:
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));
}
答案 6 :(得分:1)
Omar Elabd回答的变体-
它不是免费的,但是OzCode有免费试用版
(https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode)。
在那里的上下文/悬停菜单中内置了到JSON的导出功能,它比Object Export扩展更好(因为它不是免费的)。
http://o.oz-code.com/features#export(演示)
我知道事实已经过了几年了,但是我在这里留下答案,因为这对我有用,其他人可能会觉得有用。
答案 7 :(得分:1)
在Visual Studio的“立即”窗口中使用此命令,将c:\directory\file.json
替换为您要写入JSON的文件的完整路径,并将myObject
替换为要序列化的变量:>
System.IO.File.WriteAllText(@"c:\directory\file.json", Newtonsoft.Json.JsonConvert.SerializeObject(myObject))
答案 8 :(得分:0)
阿列克谢答案的变体。稍微复杂但不涉及写入文本文件:
1)在立即窗口中输入:
System.IO.StringWriter stringWriter = new System.IO.StringWriter();
2)在Watch Window中输入两个手表:
a. stringWriter
b. new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(stringWriter, obj)
输入第二个监视(Serialize one)后,stringWriter监视值将设置为obj序列化为XML。复制并粘贴它。请注意,XML将用大括号{...}括起来,因此如果要将XML用于任何事情,则需要删除它们。
答案 9 :(得分:0)
如果您有循环参考。在中间窗口中运行
Newtonsoft.Json.JsonConvert.SerializeObject(app, Newtonsoft.Json.Formatting.Indented,
new Newtonsoft.Json.JsonSerializerSettings
{
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize
});
答案 10 :(得分:0)
我一直在使用ObjectDumper.Net。
它很好用,尤其是在进行实时单元测试的情况下。运行测试时,我可以轻松地在控制台中查看变量的值,从而免除了手动调试的麻烦。