web-dev-qa-db-fra.com

Visual Studio comment sérialiser un objet à partir du débogueur

J'essaie d'étudier un bogue dans un vidage mémoire (pour que je ne puisse 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 examiner son état, la vue du débogueur Visual Studio est inutile. Mais l'objet a un contrat de données. J'aimerais le sérialiser, puis utiliser mon éditeur de texte préféré pour naviguer à travers l'objet. Est-il possible de faire le à partir du débogueur?

63
xvorsx

Il y a quelque temps, j'ai écrit cette ligne qui sérialisait un objet dans un fichier sur le disque. Copiez/collez-le dans votre fenêtre intermédiaire et remplacez obj (il est référencé deux fois) par votre objet. Il enregistre le fichier text.xml dans c:\temp, changez-le à votre guise.

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

Ne vous attendez pas à une magie cependant, si l'objet ne peut pas être sérialisé, il passera par une exception.

53
Alexey

Voici une extension de Visual Studio qui vous permettra de faire exactement cela:

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

Vous pouvez exporter en JSON, XML ou C #

30
Omar Elabd

Vous pouvez éventuellement utiliser la fenêtre intermédiaire pour la sérialiser, puis copier le contenu dans votre éditeur favori. 

Une autre option consiste à remplacer la méthode ToString () et à l'appeler en mode débogage.

Vous pouvez également écrire le contenu dans un fichier peu de temps avant le crash ou insérer le code dans un fichier try/catch et écrire le fichier ensuite. Je suppose que vous pouvez identifier quand il se bloque.

3
Chuck Conway

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));
}
3
Mike Cheel

Une variation de la réponse d'Omar Elabd - 

Ce n'est pas gratuit, mais il y a un essai gratuit pour OzCode
( https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode ). 

L'exportation intégrée au format JSON est intégrée au menu contextuel/survol, et cela fonctionne un peu mieux que l'extension Object Export (le compromis étant que ce n'est pas gratuit).

http://o.oz-code.com/features#export (démo)

Je sais que cela se passe quelques années après les faits, mais je laisse une réponse ici parce que cela a fonctionné pour moi et que quelqu'un d'autre pourrait le trouver utile.

1
Michael Armes

Utilisez-le dans la fenêtre "Immediate" de Visual Studio, en remplaçant c:\directory\file.json par le chemin complet du fichier dans lequel vous souhaitez écrire le JSON et myObject par votre variable à sérialiser:

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

Dans le cas où vous avez une référence circulaire. Exécuter ceci dans la fenêtre intermédiaire

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

J'ai utilisé ObjectDumper.Net .

Cela fonctionne bien, surtout si vous avez des tests unitaires en direct. Je peux facilement visualiser la valeur d'une variable dans la console lorsqu'un test est exécuté, ce qui me permet d'éviter le débogage manuellement.

0
DharmaTurtle

Une variation de la réponse d'Alexey. Un peu plus compliqué mais n'implique pas l'écriture dans un fichier texte:

1) Dans la fenêtre Immédiat, 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 surveillance (la série sérialisée), la valeur de surveillance stringWriter sera définie sur obj sérialisé en XML. Copiez et collez-le. Notez que le code XML sera placé entre accolades, {...}. Vous devrez donc les supprimer si vous souhaitez utiliser le code XML.

0
Simon Tewsi