Visual Studio如何从debugging器序列化对象
我试图调查崩溃转储中的错误(所以我不能更改代码)。 我有一个非常复杂的对象(序列化表示中有数千行),它的状态是不一致的。 为了调查它的状态,Visual Studiodebugging器视图是无用的。 但是这个对象有一个数据契约。 我想序列化它,然后使用我最喜欢的文本编辑器浏览对象。 是否有可能从debugging器?
前一段时间,我写了这个单线程序列化一个对象到磁盘上的一个文件。 复制/粘贴到您的中间窗口,并replaceobj
(它被引用两次)与您的对象。 它会将text.xml文件保存到c:\ temp,根据您的喜好进行更改。
(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)
不要指望任何魔法,如果对象不能被序列化,它会通过一个例外。
有了运气,你已经在你的appdomain中有了Json.Net。 在这种情况下,将其popup到您的立即窗口中:
Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
这里是一个Visual Studio扩展,它可以让你做到这一点:
https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f
您可以输出到JSON,XML或C#
我有一个我使用的扩展方法:
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的string重载它,并从立即窗口调用它:
public static void ToSerializedObjectForDebugging(this object o, string saveTo) { ToSerializedObjectForDebugging(o, new FileInfo(saveTo)); }
有可能使用中间窗口序列化,然后将内容复制到您最喜欢的编辑器。
另一种select是覆盖ToString()方法,并在debugging模式下调用它。
您也可以在崩溃前将文件内容写入文件,或者将代码封装到try / catch中,然后写入文件。 我假设你可以确定它何时崩溃。
阿列克谢的答案的变化。 稍微复杂一些,但不涉及写入文本文件:
1)在即时窗口中input:
System.IO.StringWriter stringWriter = new System.IO.StringWriter();
2)在观察窗口中input两个手表:
a. stringWriter b. new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(stringWriter, obj)
input第二个手表(Serialize之一)后,stringWriter监视值将被设置为obj序列化为XML。 复制并粘贴它。 请注意,XML将用大括号{…}括起来,所以如果您想要使用XML,则需要将其删除。