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


88

我正在尝试调查故障转储中的错误(因此无法更改代码)。我有一个非常复杂的对象(序列化表示中的数千行),并且其状态不一致。要调查其状态,Visual Studio调试器视图是无用的。但是对象具有数据合同。我想序列化它,然后使用我最喜欢的文本编辑器在对象上导航。是否可以通过调试器执行?


请注意,如果您有一些自定义容器类,或者您想在调试期间多次看到其他一些类,但是IntelliSense和QuickView无法弄清楚,则可以编写VS扩展名,以帮助在VS中显示您的自定义类。调试。
Csaba Toth 2013年

[这里](stackoverflow.com/questions/360277/…)也可以找到许多好的技术
乔什

Answers:


86

不久前,我写了这个单行代码,将对象序列化为磁盘上的文件。将其复制/粘贴到“即时”窗口中,然后obj用您的对象替换(两次引用)。它将保存一个text.xml文件c:\temp,根据您的喜好进行更改。

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

不过,不要指望任何魔术,如果对象无法序列化,它将引发异常。


3
这对我在即时窗口中起作用。投票,
Pankaj Kumar

1
当我在VS 2015立即窗口中使用此命令时,出现此“错误”:“不支持在此上下文中评估本机方法。” 有想法吗?
Vetras

当我运行它时,我收到以下消息:identifier "System" is undefined
Rasoul

如果有旧的VB.NET项目,则必须这样放置,否则,如果有人需要,我会在表达式语法上遇到错误:new System.Xml.Serialization.XmlSerializer(obj.GetType())。Serialize(New System.IO .StreamWriter(“ C:\ temp \ temp.txt”),obj)
Liquid Core

这是壮观的。由于具有写权限,我不得不使用其他目录,但它的工作原理很吸引人。导入到Excel中,它甚至很漂亮。
BuddyZ '19

160

运气好的话,您的appdomain中已经有了Json.Net。在这种情况下,将其弹出到“立即”窗口中:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)


19
希望我能再次投票赞成,特别是与其他答案相比。(对不起,我在职业生涯中不需要再看XML。)
yzorg 2014年

1
经过很长时间的测试调试会话后,我的程序中发生了异常,然后它才能将数千个测试结果写到文件中,我处于发生异常的断点,并且仍可以检查结果集合。这个技巧节省了我很多时间!
HAL9000

1
您可能还需要在其他地方实际使用Json.Net,以便在尝试在“即时”窗口中使用它时将其加载(而不是仅添加引用)。
伊万(Evan)

1
我必须使用Nuget添加Newtonsoft.Json包,还必须在具有断点的方法中添加一行代码,以创建虚拟Newtonsoft.Json.JsonArrayAttribute()类以使其正常工作。一个最优秀的解决方案!
理查德·摩尔

1
这是一个很好的答案。我仅需很小的改动就可以使用它,节省了我去美容师的旅程。Newtonsoft.Json.JsonConvert.SerializeObject(someVariable,Newtonsoft.Json.Formatting.Indented)
杰米

37

这是一个Visual Studio扩展,它将使您能够准确地做到这一点:

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

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


4
这种联系似乎被打破,但这里是GitHub的项目,你可以找到它,如果你在Visual Studio中的“扩展和更新...”对话框搜索“对象导出”。大扩展顺便说一句!
NiklasSöderberg,2015年

2
谢谢@Omar这个想法很完美。但是它花费的时间太长,并且在某些情况下会冻结
Wahid Bitar

1
同意@WahidBitar-非常好的概念-非常适合设置单元测试数据,但是扩展名似乎有很多问题,当崩溃时会带上Visual Studio!
Dib

这确实是一个非常有用的工具。
阿舒托什·辛格


4

在Visual Studio的“立即”窗口中使用它,用c:\directory\file.json要写入JSON的文件的完整路径以及myObject要序列化的变量替换:

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

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

3

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

另一种选择是覆盖该ToString()方法并在调试模式下调用它。

您也可以在崩溃前不久将内容写到文件中,或将代码包装到try / catch中,然后将其写入。我假设您可以确定它何时崩溃。


谢谢,我在“监视”窗口中尝试了同样的操作,但是它告诉我“函数评估要求所有线程都运行。” 立即窗口解决它
xvorsx

1

来自Omar Elabd的答案的变体-

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

在那里的上下文/悬停菜单中内置了到JSON的导出功能,它比Object Export扩展更好(它不是免费的)。

http://o.oz-code.com/features#export(演示)

我知道事实已经过了几年了,但是我在这里留下答案,因为这对我有用,其他人可能会觉得有用。


1

如果您有循环引用,请在立即窗口中运行它:

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

1

我一直在使用ObjectDumper.Net

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

如果您使用的是XUnit,可能会有所帮助。


0

阿列克谢答案的变化。稍微复杂一点,但是不涉及写入文本文件:

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用于任何内容,则需要将其删除。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.