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?


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.


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)


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 #


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

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

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.


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.


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

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.