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


88

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


カスタムコンテナクラス、またはデバッグ中に何度も表示したい他のクラスがあるが、IntelliSenseとQuickViewがそれを理解できない場合は、カスタムクラスを表示するのに役立つVSの拡張機能を作成できます。デバッグ。
csaba Toth 2013

多くの優れた技術はまた、([こちら]見つけることができますstackoverflow.com/questions/360277/...
ジョシュ

回答:


86

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

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

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


3
これは、すぐにウィンドウで機能しました。賛成、
Pankaj Kumar

1
VS 2015イミディエイトウィンドウでこれを使用すると、「このコンテキストでのネイティブメソッドの評価はサポートされていません」という「エラー」が発生します。アイデア?
vetras 2016年

私はそれを実行すると、私は次のメッセージが表示されます:identifier "System" is undefined
Rasoul

古いVB.NETプロジェクトがあった場合は、次のように配置する必要がありました。そうしないと、必要に応じて式の構文に関するエラーが発生していました:new System.Xml.Serialization.XmlSerializer(obj.GetType())。Serialize(New System.IO .StreamWriter( "C:\ temp \ temp.txt")、obj)
Liquid Core

これは壮観です。書き込み権限のために別のディレクトリを使用する必要がありましたが、それは魅力のように機能しました。Excelにインポートすると、さらにきれいになります。
BuddyZ

160

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

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)


19
特に他の回答と比較して、これをもう一度賛成できたらいいのにと思います。(申し訳ありませんが、私のキャリアでXMLの別の行を見る必要はありません。)
yzorg 2014年

1
非常に長いテストデバッグセッションの後、何千ものテスト結果をファイルに書き出す前にプログラムで例外が発生しましたが、例外が発生したブレークポイントにあり、結果コレクションを検査できました。このヒントは私に多くの時間を節約しました!
HAL9000 2015

1
Json.Netを別の場所で実際に使用して、(参照を追加するだけでなく)イミディエイトウィンドウで使用しようとしたときに読み込まれるようにする必要がある場合があります。
エヴァン

1
Nugetを使用してNewtonsoft.Jsonパッケージを追加し、ブレークポイントを設定したメソッドにコード行を追加して、ダミーのNewtonsoft.Json.JsonArrayAttribute()クラスを作成して機能させる必要がありました。最も優れたソリューション!
リチャード・ムーア

1
これは素晴らしい答えです。私はそれをほんの少しの変更で使用して、美容師への旅行を節約します。Newtonsoft.Json.JsonConvert.SerializeObject(someVariable、Newtonsoft.Json.Formatting.Indented)
ジェイミー

37

これは、まさにそれを可能にするVisualStudio拡張機能です。

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

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


4
そのリンクは壊れているようですが、これがgithubプロジェクトであり、VisualStudioの[拡張機能と更新...]ダイアログで[オブジェクトエクスポーター]を検索すると見つかります。素晴らしい拡張機能です!
ニクラス・ソダーバーグ

2
ありがとう@Omarアイデアは完璧です。しかし、時間がかかりすぎてフリーズする場合もあります
Wahid Bitar 2017

1
@WahidBitarに同意しました-素晴らしいコンセプト-単体テストデータのセットアップに最適ですが、拡張機能はかなりバグがあるようで、クラッシュしたときにVisual Studioを使用します!
ディブ2018年

これは本当にとても便利なツールです。
AshutoshSingh18年


4

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

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

3

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

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

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

もう1つのオプションは、ToString()メソッドをオーバーライドして、デバッグモードで呼び出すことです。

クラッシュの直前にコンテンツをファイルに書き出すことも、コードをtry / catchにラップして、ファイルに書き込むこともできます。いつクラッシュするかは識別できると思います。


おかげさまで、ウォッチウィンドウから同じことを試しましたが、「関数の評価にはすべてのスレッドを実行する必要があります」と表示されました。即時ウィンドウで解決
xvorsx 2013

1

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

無料ではありませんが、OzCodeの無料トライアルがあります
https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode)。

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

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

これは事実から数年後のことですが、これは私にとってはうまくいったので、ここに答えを残します。他の誰かがそれを役立つかもしれません。


1

循環参照がある場合は、すぐにウィンドウでこれを実行します。

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

1

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

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

これは、XUnitを使用している場合に役立つことがあります。


0

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

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番目のウォッチ(シリアル化するもの)を入力すると、stringWriterウォッチ値はXMLにシリアル化されたobjに設定されます。コピーして貼り付けます。XMLは中括弧{...}で囲まれるため、XMLを何かに使用する場合は、それらを削除する必要があることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.