webentwicklung-frage-antwort-db.com.de

Visual Studio zum Serialisieren von Objekten aus dem Debugger

Ich versuche, einen Fehler in einem Absturzabbild zu untersuchen (damit ich den Code nicht ändern kann.) Ich habe ein wirklich kompliziertes Objekt (Tausende von Zeilen in der serialisierten Darstellung) und sein Status ist inkonsistent. Um den Status zu untersuchen, ist die Visual Studio-Debuggeransicht unbrauchbar. Das Objekt hat jedoch einen Datenvertrag. Ich möchte es serialisieren und dann mit meinem bevorzugten Texteditor über das Objekt navigieren. Kann man das vom Debugger aus machen?

63
xvorsx

Vor einiger Zeit schrieb ich diesen Einzeiler, der ein Objekt in eine Datei auf der Festplatte serialisiert. Kopieren Sie es in Ihr Zwischenfenster, und ersetzen Sie obj (es wird zweimal darauf verwiesen) durch Ihr Objekt. Die Datei text.xml wird unter c:\temp gespeichert und kann nach Belieben geändert werden.

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

Erwarten Sie jedoch keine Magie. Wenn das Objekt nicht serialisiert werden kann, wird es eine Ausnahme durchlaufen.

53
Alexey

Mit etwas Glück haben Sie Json.Net bereits in Ihrer Appdomain. In diesem Fall fügen Sie dies in Ihr Direktfenster ein:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)

118
mcintyre321

Hier ist eine Visual Studio-Erweiterung, mit der Sie genau das tun können:

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

Sie können in JSON, XML oder C # ausgeben.

30
Omar Elabd

Möglicherweise können Sie das Zwischenfenster verwenden, um es zu serialisieren und den Inhalt anschließend in Ihren bevorzugten Editor zu kopieren. 

Eine andere Option ist, die ToString () -Methode zu überschreiben und sie im Debug-Modus aufzurufen.

Sie können den Inhalt auch kurz vor dem Absturz in eine Datei schreiben oder den Code in einen try/catch-Code umschließen und dann die Datei schreiben. Ich gehe davon aus, dass Sie feststellen können, wann es abstürzt.

3
Chuck Conway

Ich habe eine Erweiterungsmethode, die ich verwende: 

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

Ich überlade es mit einem String für saveTo und rufe es vom nächsten Fenster aus auf:

public static void ToSerializedObjectForDebugging(this object o, string saveTo)
{
    ToSerializedObjectForDebugging(o, new FileInfo(saveTo));
}
3
Mike Cheel

Eine Variation der Antwort von Omar Elabd - 

Es ist nicht kostenlos, aber es gibt eine kostenlose Testversion für OzCode
( https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode ). 

Es gibt einen eingebauten Export nach JSON im Kontext-/Hover-Menü, und es funktioniert etwas besser als die Object Export-Erweiterung (der Kompromiss ist nicht frei).

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

Ich weiß, das ist ein paar Jahre nach der Tatsache, aber ich lasse hier eine Antwort, weil dies für mich funktionierte und jemand anderes es für nützlich hält.

1
Michael Armes

Verwenden Sie dies in Visual Studios "Sofort" -Fenster und ersetzen Sie c:\directory\file.json durch den vollständigen Pfad zu der Datei, in die Sie JSON und myObject mit Ihrer zu serialisierenden Variablen schreiben möchten:

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

Falls Sie einen Zirkelverweis haben. Führen Sie dies im Zwischenfenster aus

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

Ich habe ObjectDumper.Net verwendet.

Es funktioniert gut, besonders wenn Sie Live-Unit-Tests haben. Wenn ein Test ausgeführt wird, kann ich den Wert einer Variablen auf einfache Weise in der Konsole anzeigen, um das manuelle Debuggen zu verhindern.

0
DharmaTurtle

Eine Variante der Antwort von Alexey. Etwas komplizierter, jedoch nicht in eine Textdatei geschrieben:

1) Geben Sie im Direktfenster Folgendes ein: 

System.IO.StringWriter stringWriter = new System.IO.StringWriter();  

2) Geben Sie im Uhrenfenster zwei Uhren ein:

a.  stringWriter

b.  new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(stringWriter, obj) 

Nachdem Sie die zweite Überwachung (die Serialize-Überwachung) eingegeben haben, wird der StringWriter-Überwachungswert auf "obj serialized" in XML gesetzt. Kopieren Sie es und fügen Sie es ein. Beachten Sie, dass das XML in geschweiften Klammern {...} eingeschlossen ist. Sie müssen also entfernt werden, wenn Sie das XML für irgendetwas verwenden möchten.

0
Simon Tewsi