Visual Studio, jak serializować obiekt z debugera

88

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?

xvorsx
źródło
Zwróć uwagę, że jeśli masz jakąś niestandardową klasę kontenera lub inną klasę, którą chcesz zobaczyć wiele razy podczas debugowania, ale IntelliSense i QuickView nie mogą tego rozgryźć, możesz napisać rozszerzenie dla VS, które pomoże pokazać twoją klasę niestandardową w odpluskwić.
Csaba Toth
Wiele dobrych technik można również znaleźć [tutaj] ( stackoverflow.com/questions/360277/… )
Josh

Odpowiedzi:

86

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. Zapisuje text.xmlplik w formacie c:\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.

Alexey
źródło
3
To zadziałało dla mnie w bezpośrednim oknie. przegłosowano,
Pankaj Kumar
1
kiedy używam tego w oknie bezpośrednim VS 2015, pojawia się ten „błąd”: „Ocena metod natywnych w tym kontekście nie jest obsługiwana”. Pomysły?
Vetras,
Kiedy go uruchamiam, otrzymuję następującą wiadomość:identifier "System" is undefined
Rasoul
Miałem stary projekt VB.NET, musiałem to opisać w ten sposób, w przeciwnym razie otrzymywałem błąd dotyczący składni wyrażenia, jeśli ktoś potrzebuje: new System.Xml.Serialization.XmlSerializer (obj.GetType ()). Serialize (New System.IO .StreamWriter ("C: \ temp \ temp.txt"), obj)
Liquid Core,
To jest spektakularne. Musiałem użyć innego katalogu ze względu na uprawnienia do zapisu, ale działało to jak urok. Importuj do Excela i jest nawet ładny.
BuddyZ
160

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)

mcintyre321
źródło
19
Chciałbym móc ponownie zagłosować za tym głosem, zwłaszcza w porównaniu z innymi odpowiedziami. (Przepraszam, ale nie potrzebuję kolejnej linii XML w mojej karierze.)
yzorg
1
Po bardzo długiej sesji debugowania testowego w moim programie wydarzył się wyjątek, zanim mógł on zapisać tysiące wyników testów do pliku. Byłem w punkcie przerwania, w którym wystąpił wyjątek i nadal mogłem sprawdzić kolekcję wyników. Ta wskazówka zaoszczędziła mi dużo czasu!
HAL9000
1
Być może będziesz musiał faktycznie użyć Json.Net w innym miejscu, aby został załadowany, gdy spróbujesz go użyć w oknie bezpośrednim (w przeciwieństwie do zwykłego dodania odwołania).
Evan,
1
Musiałem dodać pakiet Newtonsoft.Json za pomocą Nuget, a także dodać wiersz kodu w metodzie, w której miałem punkt przerwania, aby utworzyć fikcyjną klasę Newtonsoft.Json.JsonArrayAttribute (), aby to zadziałało. Najdoskonalsze rozwiązanie!
Richard Moore
1
To świetna odpowiedź. Używam go z niewielką zmianą, aby zaoszczędzić mi podróży do kosmetyczki. Newtonsoft.Json.JsonConvert.SerializeObject (someVariable, Newtonsoft.Json.Formatting.Indented)
Jamie
37

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 #

Omar Elabd
źródło
4
Wydaje się, że to łącze jest uszkodzone, ale tutaj jest projekt github i możesz go znaleźć, wyszukując „Eksporter obiektów” w oknie dialogowym „Rozszerzenia i aktualizacje ...” w programie Visual Studio. Przy okazji świetne rozszerzenie!
Niklas Söderberg
2
Dziękuję @Omar Pomysł jest doskonały. Ale zajmuje to zbyt dużo czasu i w niektórych przypadkach zamarza
Wahid Bitar
1
Zgadzam się z @WahidBitar - Świetna koncepcja - idealna do konfigurowania danych testów jednostkowych, ale rozszerzenie wydaje się dość błędne i zabiera Visual Studio ze sobą, gdy się zawiesza!
Dib
To naprawdę bardzo przydatne narzędzie.
Ashutosh Singh
4

Użyj tego w oknie „Immediate” programu Visual Studio, zastępując c:\directory\file.jsonpełną ścieżkę do pliku, do którego chcesz zapisać JSON, oraz myObjectzmienną do serializacji:

System.IO.File.WriteAllText(@"c:\directory\file.json", Newtonsoft.Json.JsonConvert.SerializeObject(myObject))
Chris Peacock
źródło
3

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));
}
Mike Cheel
źródło
3

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.

Chuck Conway
źródło
Dzięki, próbowałem tego samego z okna Watch, ale powiedział mi: „Ocena funkcji wymaga działania wszystkich wątków”. Natychmiastowe okno rozwiązuje to
xvorsx
1

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.

Michael Armes
źródło
1

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
});
InGeek
źródło
1

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.

DharmaTurtle
źródło
0

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.

Simon Tewsi
źródło