J'essaye d'enquêter sur un bogue dans un vidage sur incident (donc je ne peux pas changer le code). J'ai un objet vraiment compliqué (des milliers de lignes dans la représentation sérialisée) et son état est incohérent. Pour étudier son état, la vue du débogueur Visual Studio est inutile. Mais l'objet a un contrat de données. Je voudrais le sérialiser, puis utiliser mon éditeur de texte préféré pour naviguer à travers l'objet. Est-il possible de faire le depuis le débogueur?
88
Réponses:
Il y a quelque temps, j'ai écrit ce one-liner sérialisant un objet dans un fichier sur le disque. Copiez / collez-le dans votre fenêtre Exécution et remplacez-le
obj
(il est référencé deux fois) par votre objet. Il enregistrera untext.xml
fichierc:\temp
et le modifiera à votre guise.(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)
Ne vous attendez pas à de la magie, si l'objet ne peut pas être sérialisé, il lèvera une exception.
la source
identifier "System" is undefined
Avec un peu de chance, vous avez déjà Json.Net dans votre domaine d'application. Dans ce cas, insérez ceci dans votre fenêtre Exécution:
Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
la source
Voici une extension Visual Studio qui vous permettra de faire exactement cela:
https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f
Vous pouvez exporter vers JSON, XML ou C #
la source
Utilisez ceci dans la fenêtre "Immédiat" de Visual Studio, en remplaçant
c:\directory\file.json
par le chemin d'accès complet au fichier dans lequel vous souhaitez écrire le JSON etmyObject
par votre variable à sérialiser:System.IO.File.WriteAllText(@"c:\directory\file.json", Newtonsoft.Json.JsonConvert.SerializeObject(myObject))
la source
J'ai une méthode d'extension que j'utilise:
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); } }
Je le surcharge avec une chaîne pour saveTo et l'appelle depuis la fenêtre immédiate:
public static void ToSerializedObjectForDebugging(this object o, string saveTo) { ToSerializedObjectForDebugging(o, new FileInfo(saveTo)); }
la source
Il peut être possible d'utiliser la fenêtre immédiate pour la sérialiser, puis copier le contenu dans votre éditeur préféré.
Une autre option consiste à remplacer la
ToString()
méthode et à l'appeler en mode débogage.Vous pouvez également écrire le contenu dans un fichier peu de temps avant le crash, ou encapsuler le code dans un try / catch et écrire le fichier ensuite. Je suppose que vous pouvez identifier quand il plante.
la source
Une variation sur la réponse d'Omar Elabd -
Ce n'est pas gratuit, mais il existe un essai gratuit pour OzCode
( https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode ).
Il y a une exportation intégrée vers JSON dans le menu contextuel / survolé, et cela fonctionne un peu mieux que l'extension Object Export (le compromis pour ce n'est pas gratuit).
http://o.oz-code.com/features#export (démo)
Je sais que c'est quelques années après les faits, mais je laisse une réponse ici parce que cela a fonctionné pour moi, et quelqu'un d'autre peut la trouver utile.
la source
Si vous avez une référence circulaire, exécutez-la dans la fenêtre immédiate:
Newtonsoft.Json.JsonConvert.SerializeObject(app, Newtonsoft.Json.Formatting.Indented, new Newtonsoft.Json.JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize });
la source
J'utilise ObjectDumper.Net .
Cela fonctionne bien, surtout si vous avez des tests unitaires en direct. Je peux facilement afficher la valeur d'une variable dans la console lorsqu'un test s'exécute, ce qui m'évite de déboguer manuellement.
Cela peut aider si vous utilisez XUnit.
la source
Une variation de la réponse d'Alexey. Légèrement plus compliqué mais n'implique pas d'écrire dans un fichier texte:
1) Dans la fenêtre immédiate, entrez:
System.IO.StringWriter stringWriter = new System.IO.StringWriter();
2) Dans la fenêtre de surveillance, entrez deux montres:
a. stringWriter b. new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(stringWriter, obj)
Une fois que vous avez entré la deuxième montre (celle de Sérialisation), la valeur de la surveillance stringWriter sera définie sur obj sérialisé en XML. Copiez et collez-le. Notez que le XML sera entre accolades, {...}, vous devrez donc les supprimer si vous voulez utiliser le XML pour quoi que ce soit.
la source