Estoy tratando de investigar un error en un volcado de memoria (por lo que no puedo cambiar el código). Tengo un objeto realmente complicado (miles de líneas en la representación serializada) y su estado es inconsistente. Para investigar su estado, la vista del depurador de Visual Studio es inútil. Pero el objeto tiene un contrato de datos. Me gustaría serializarlo y luego usar mi editor de texto favorito para navegar por el objeto. ¿Es posible hacer el depurador?
88
Respuestas:
Hace algún tiempo escribí este resumen serializando un objeto en un archivo en el disco. Cópielo / péguelo en su ventana Inmediato y reemplácelo
obj
(se hace referencia dos veces) con su objeto. Guardará untext.xml
archivo enc:\temp
, cámbielo a su gusto.(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)
Sin embargo, no espere magia, si el objeto no se puede serializar, generará una excepción.
fuente
identifier "System" is undefined
Con suerte, ya tienes Json.Net en tu dominio de aplicación. En cuyo caso, introduzca esto en su ventana Inmediato:
Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
fuente
Aquí hay una extensión de Visual Studio que le permitirá hacer exactamente eso:
https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f
Puede generar en JSON, XML o C #
fuente
Use esto en la ventana "Inmediato" de Visual Studio, reemplazando
c:\directory\file.json
con la ruta completa al archivo en el que le gustaría escribir el JSON ymyObject
con su variable para serializar:System.IO.File.WriteAllText(@"c:\directory\file.json", Newtonsoft.Json.JsonConvert.SerializeObject(myObject))
fuente
Tengo un método de extensión que uso:
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); } }
Lo sobrecargo con una cadena para saveTo y lo llamo desde la ventana inmediata:
public static void ToSerializedObjectForDebugging(this object o, string saveTo) { ToSerializedObjectForDebugging(o, new FileInfo(saveTo)); }
fuente
Podría ser posible usar la ventana inmediata para serializarlo y luego copiar el contenido a su editor favorito.
Otra opción es anular el
ToString()
método y llamarlo mientras está en modo de depuración.También puede escribir el contenido en un archivo poco antes del bloqueo, o envolver el código en un try / catch y luego escribir el archivo. Supongo que puede identificar cuándo se bloquea.
fuente
Una variación de la respuesta de Omar Elabd:
No es gratis, pero hay una prueba gratuita de OzCode
( https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode ).
Hay una exportación incorporada a JSON dentro del menú contextual / flotante allí, y funciona un poco mejor que la extensión Object Export (la compensación por no ser gratuita).
http://o.oz-code.com/features#export (demostración)
Sé que esto es unos años después del hecho, pero dejo una respuesta aquí porque esto funcionó para mí, y alguien más puede encontrarlo útil.
fuente
En caso de que tenga una referencia circular, ejecute esto en la ventana inmediata:
Newtonsoft.Json.JsonConvert.SerializeObject(app, Newtonsoft.Json.Formatting.Indented, new Newtonsoft.Json.JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize });
fuente
He estado usando ObjectDumper.Net .
Funciona bien, especialmente si tiene pruebas de unidades en vivo. Puedo ver fácilmente el valor de una variable en la consola cuando se ejecuta una prueba, lo que me ahorra tener que depurar manualmente.
Esto puede ayudar si está usando XUnit.
fuente
Una variación de la respuesta de Alexey. Un poco más complicado, pero no implica escribir en un archivo de texto:
1) En la ventana Inmediato ingrese:
System.IO.StringWriter stringWriter = new System.IO.StringWriter();
2) En la ventana Watch, ingrese dos relojes:
a. stringWriter b. new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(stringWriter, obj)
Después de ingresar el segundo reloj (el de Serializar), el valor del reloj de stringWriter se establecerá en obj serializado en XML. Cópialo y pégalo. Tenga en cuenta que el XML se incluirá entre llaves, {...}, por lo que deberá eliminarlo si desea utilizar el XML para cualquier cosa.
fuente