Visual Studio如何从调试器序列化对象

时间:2013-09-13 19:57:57

标签: c# visual-studio-2012

我正在尝试调查崩溃转储中的错误(因此我无法更改代码)。 我有一个非常复杂的对象(序列化表示中有数千行),并且它的状态不一致。要调查其状态,Visual Studio调试器视图是无用的。但该对象有一个数据契约。我想序列化它,然后使用我喜欢的文本编辑器浏览对象。是否可以从调试器中执行此操作?

11 个答案:

答案 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

它很好用,尤其是在进行实时单元测试的情况下。运行测试时,我可以轻松地在控制台中查看变量的值,从而免除了手动调试的麻烦。