Próbuję zbadać błąd w zrzucie awaryjnym (więc nie mogę zmienić kodu). Mam naprawdę skomplikowany obiekt (tysiące linii w serializowanej reprezentacji) i jego stan jest niespójny. Aby zbadać jego stan, widok debugera programu Visual Studio jest bezużyteczny. Ale obiekt ma kontrakt danych. Chciałbym go serializować, a następnie użyć mojego ulubionego edytora tekstu do nawigacji po obiekcie. Czy można to zrobić z debuggera?
88
Odpowiedzi:
Jakiś czas temu napisałem tę jednowierszową serializację obiektu do pliku na dysku. Skopiuj / wklej go do swojego bezpośredniego okna i zastąp
obj
(odwołuje się dwukrotnie) swoim obiektem. Zapisujetext.xml
plik w formaciec:\temp
, zmienia go według własnych upodobań.(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)
Nie spodziewaj się jednak żadnej magii, jeśli obiekt nie może zostać serializowany, zgłosi wyjątek.
źródło
identifier "System" is undefined
Przy odrobinie szczęścia masz już Json.Net w swojej domenie. W takim przypadku wrzuć to do swojego bezpośredniego okna:
Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
źródło
Oto rozszerzenie Visual Studio, które pozwoli Ci to zrobić:
https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f
Możesz wyprowadzać do JSON, XML lub C #
źródło
Użyj tego w oknie „Immediate” programu Visual Studio, zastępując
c:\directory\file.json
pełną ścieżkę do pliku, do którego chcesz zapisać JSON, orazmyObject
zmienną do serializacji:System.IO.File.WriteAllText(@"c:\directory\file.json", Newtonsoft.Json.JsonConvert.SerializeObject(myObject))
źródło
Mam metodę rozszerzenia, której używam:
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); } }
Przeciążam go ciągiem do saveTo i wywołuję go z bezpośredniego okna:
public static void ToSerializedObjectForDebugging(this object o, string saveTo) { ToSerializedObjectForDebugging(o, new FileInfo(saveTo)); }
źródło
Może być możliwe użycie bezpośredniego okna do serializacji, a następnie skopiowanie zawartości do ulubionego edytora.
Inną opcją jest zastąpienie
ToString()
metody i wywołanie jej w trybie debugowania.Możesz również zapisać zawartość do pliku na krótko przed awarią lub zawinąć kod w try / catch i następnie zapisać plik. Zakładam, że możesz zidentyfikować, kiedy się zawiesza.
źródło
Odmiana odpowiedzi Omara Elabda -
To nie jest darmowe, ale dostępna jest bezpłatna wersja próbna OzCode
( https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode ).
Istnieje wbudowany eksport do JSON w menu kontekstowym / najechania kursorem i działa nieco lepiej niż rozszerzenie Eksport obiektów (kompromis za to, że nie jest darmowy).
http://o.oz-code.com/features#export (demo)
Wiem, że jest to kilka lat po fakcie, ale zostawiam tutaj odpowiedź, ponieważ to zadziałało i ktoś inny może uznać to za przydatne.
źródło
Jeśli masz odwołanie cykliczne, uruchom to w bezpośrednim oknie:
Newtonsoft.Json.JsonConvert.SerializeObject(app, Newtonsoft.Json.Formatting.Indented, new Newtonsoft.Json.JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize });
źródło
Używam ObjectDumper.Net .
Działa dobrze, zwłaszcza jeśli masz testy jednostkowe na żywo. Mogę łatwo wyświetlić wartość zmiennej w konsoli po uruchomieniu testu, oszczędzając mi to przed ręcznym debugowaniem.
Może to pomóc, jeśli używasz XUnit.
źródło
Odmiana odpowiedzi Alexeya. Nieco bardziej skomplikowane, ale nie wymaga zapisywania do pliku tekstowego:
1) W oknie bezpośrednim wprowadź:
System.IO.StringWriter stringWriter = new System.IO.StringWriter();
2) W oknie zegarka wprowadź dwa zegarki:
a. stringWriter b. new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(stringWriter, obj)
Po wprowadzeniu drugiego zegarka (Serialize) wartość obserwatora stringWriter zostanie ustawiona na obj serialized do XML. Skopiuj i wklej. Zwróć uwagę, że XML zostanie ujęty w nawiasy klamrowe, {...}, więc musisz je usunąć, jeśli chcesz używać XML do czegokolwiek.
źródło