22

.NET の Deserilization エラーは非常に一般的です。たとえば、次のようなものです。

System.ArgumentException: 'System.Uri' 型のオブジェクトを 'System.String' 型に変換できません。

オブジェクトのプロパティの型を変更したことは明らかですが、このシリアル化されたオブジェクトには 10 ~ 15 の異なるクラスがあるため、どのクラスを変更したのか、どのコミットがこれを台無しにしたのかを特定するのは非常に困難です。

このエラーを実際に引き起こしているクラス (または少なくともどのクラス) のどのプロパティに関する情報を取得する方法はありますか? これを行うための外部ツールまたは既知の方法はありますか?

PS バイナリシリアライザーを使用すべきではない理由や、下位互換性のために代わりに X、Y を使用する理由などを誰かが教え始める前に、それらに関するアドバイスを保存してください。私はそれらすべてを認識していますが、それは問題ではありません。

4

3 に答える 3

9

フレームワーク コードへのデバッグを有効にして (このリンクを参照)、ctrl + shift + e を押してすべてのマネージ コード例外を選択すると、失敗した実際のソース行にエラーが表示されます。スタック トレースを使用して、その時点でオブジェクトのどの部分を逆シリアル化しようとしていたかを確認できるはずです。

簡単ではありませんが、それが私たちがやった方法です。

于 2011-02-03T21:31:19.220 に答える
1

内部スタック トレースを確認すると、役立つ場合があります。シリアライザーは、シリアライズ/デシリアライズするタイプを処理するためのクラスを生成します。

スタックトレースに含まれる関数の関数名を見るだけで、どのノード ノードが壊れているかを突き止めることができます。

これは、特に大規模で複雑な XML ファイルの場合に、問題がどこにあるかを絞り込むのに役立ちます。

例:

  at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   at System.Xml.XmlConvert.ToInt32(String s)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read13_Item(Boolean isNullable, Boolean checkType) //Tells you the issue is on the RootNodeSubNodeSubSubNode on an item withing it.
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read17_RootNodeSubNodeSubSubNode(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read26_RootNodeSubNode(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read50_RootNode(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read51_RootNode()
于 2013-11-15T10:54:06.363 に答える
1

できることはいくつかありますが、どれも素晴らしいものではありません。特にバイナリ シリアライゼーションでは。ISerializableインターフェイスを使用してカスタムのシリアル化処理を追加できます。これにより、デバッガーで逆シリアル化プロセスをステップ実行できます。

開発/デバッグ目的で Xml シリアル化に切り替えることを検討しましたか? Xml シリアル化で使用できるフックが他にもいくつかあります。しかし、それはあなたにとってはうまくいかないように思えます。おそらく、リモート インターフェースか、ディスクに保存された古いバイナリ データを読み取る必要があるためです。

ただし、ソース管理システムのログを調べて、型が変更されたメソッドを探す方が簡単です。

于 2011-02-03T21:24:10.133 に答える