web-dev-qa-db-ja.com

Visual Studioデバッガーからオブジェクトをシリアル化する方法

クラッシュダンプのバグを調査しようとしています(そのため、コードを変更できません)。本当に複雑なオブジェクト(シリアル化された表現では数千行)があり、その状態は一貫していません。その状態を調査するために、Visual Studioデバッガービューは役に立ちません。しかし、オブジェクトにはデータコントラクトがあります。シリアル化してから、お気に入りのテキストエディターを使用してオブジェクト間を移動したいと思います。デバッガから行うことは可能ですか?

68
xvorsx

しばらく前に、オブジェクトをディスク上のファイルにシリアル化するこのワンライナーを書きました。イミディエイトウィンドウにコピーして貼り付け、obj(2回参照されます)をオブジェクトに置き換えます。 text.xmlファイルをc:\tempに保存し、お好みに変更します。

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

ただし、魔法を期待しないでください。オブジェクトをシリアル化できない場合、例外がスローされます。

65
Alexey

運がよければ、すでにappdomainにJson.Netがあります。その場合、これをイミディエイトウィンドウにポップします。

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)

118
mcintyre321

まさにそれを可能にするVisual Studio拡張機能を次に示します。

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

JSON、XML、またはC#に出力できます

32
Omar Elabd

イミディエイトウィンドウを使用してシリアル化してから、お気に入りのエディターにコンテンツをコピーすることができます。

別のオプションは、ToString()メソッドをオーバーライドし、デバッグモードで呼び出します。

また、クラッシュの少し前に内容をファイルに書き出すことも、コードをtry/catchにラップしてファイルを書き込むこともできます。いつクラッシュするかを特定できると思います。

3
Chuck Conway

私が使用する拡張メソッドがあります:

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

SaveToの文字列でオーバーロードし、イミディエイトウィンドウから呼び出します。

public static void ToSerializedObjectForDebugging(this object o, string saveTo)
{
    ToSerializedObjectForDebugging(o, new FileInfo(saveTo));
}
3
Mike Cheel

循環参照がある場合は、イミディエイトウィンドウでこれを実行します。

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

ObjectDumper.Net を使用しています。

特に、ライブユニットテストがある場合は、うまく機能します。テストの実行時にコンソールで変数の値を簡単に表示できるため、手動でデバッグする必要がなくなります。

これ は、XUnitを使用している場合に役立ちます。

1
DharmaTurtle

Omar Elabdからの回答のバリエーション-

無料ではありませんが、OzCodeの無料試用版があります
https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode )。

コンテキスト/ホバーメニュー内にJSONへの組み込みのエクスポートがあり、Object Export拡張機能よりも少しうまく機能します(無料ではないというトレードオフ)。

http://o.oz-code.com/features#export (デモ)

私はこれが事実から数年後であることを知っていますが、これは私のために働いたので、ここで答えを残しています。

1
Michael Armes

Visual Studioの「イミディエイト」ウィンドウでこれを使用し、c:\directory\file.jsonをJSONの書き込み先ファイルへのフルパスに置き換え、myObjectをシリアル化する変数に置き換えます。

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

Alexeyの回答のバリエーション。少し複雑ですが、テキストファイルへの書き込みは含まれません。

1)イミディエイトウィンドウで次を入力します。

System.IO.StringWriter stringWriter = new System.IO.StringWriter();  

2)ウォッチウィンドウに2つのウォッチを入力します。

a.  stringWriter

b.  new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(stringWriter, obj) 

2番目のウォッチ(Serializeウォッチ)を入力すると、stringWriterウォッチの値はXMLにシリアル化されたobjに設定されます。コピーして貼り付けます。 XMLは中括弧{...}で囲まれるため、XMLを何かに使用する場合は削除する必要があります。

0
Simon Tewsi