web-dev-qa-db-ja.com

C#XmlSerializer BindingFailure

XmlSerializerを使用してコード行でBindingFailureを取得します。

XmlSerializer s = new XmlSerializer(typeof(CustomXMLSerializeObject));

表示名がCustomXMLSerializeObject.XmlSerializers 'のアセンブリは、ID 1のAppDomainの' LoadFrom 'バインディングコンテキストでの読み込みに失敗しました。失敗の原因は次のとおりです:System.IO.FileNotFoundException:ファイルまたはアセンブリXMLSerializeObject.XmlSerializers、Versionを読み込めませんでした= 1.4.0.0、Culture = neutral、PublicKeyToken = null 'またはその依存関係の1つ。システムは、指定されたファイルを見つけることができません。

エラーは非常に長く、バインド前の状態情報と、ファイルを見つけようと試みた場所を説明し続けます。

私が逆シリアル化しようとしているカスタムオブジェクトは比較的単純です-パブリックアクセサーを持つプライベート整数と文字列の束だけです。別のカスタムシリアライズ可能クラスであるプライベート変数がありますが、その中にはパブリックアクセサーを含むプライベート文字列しかありません。

ぎこちない部分は?これは、逆シリアル化したときにのみ発生します。オブジェクトをシリアル化すると、そのコード行は正常に実行されます。それは正常に動作し、オブジェクトはデシリアライズされて完全に入力されます。パフォーマンスの低下や長いロード時間に気付かないでください。

この警告は正確には何ですか(エラーや例外ではなく、プログラムは後で正常に実行されます)?なぜそれが起こるのですか?単に警告を無効にすることなくそれを防ぐにはどうすればよいですか?

47
Steve H.

奇妙なXmlSerializerエラー によると:

この例外は、XmlSerializerの通常の操作の一部です。これは予期されており、フレームワークコード内でキャッチおよび処理されます。無視して続行してください。デバッグ中に問題が発生する場合は、Visual Studioデバッガーを、すべての例外ではなく、ハンドルされていない例外でのみ停止するように設定します。

おそらく、監視することを選択している例外に基づいて引き起こされます。

例外の設定方法を教えてください:デバッグ->例外

Managed Debugging Assistantsの下のBindingFailureの「Thrown」チェックボックスをオフにすると、例外はなくなります。または、これを実行したくない場合は、この例外は仕様によるものなので、そのまま続行できます。

59
SwDevMan81

次のメソッドを使用してxmlSerializerインスタンスを作成し、問題を解決します。

XmlSerializer s = XmlSerializer.FromTypes(new[] { typeof(CustomXMLSerializeObject) })[0];

その後、例外処理をオフにする必要はありません。

39
Lin Song Yang

MS VS 2010フィードバック によると、このように設計されています。この例外を回避し、実行時の速度低下を防ぐには、XMLシリアライザーアセンブリを生成する必要があります。

私が見つけることができる3つのツールがあります: Microsoft SGenXGenPlus および Mvp.Xml.XGen 。この投稿の時点では、残念ながらこれらは2007年以降更新されていません。

4
Lucas B

解決策を見つけました。例外をオフにすることを答えとして受け入れることはできませんでした。どういうわけか間違っているようです...

起こっているように見えるのは、以前のアセンブリ、または現在のアセンブリの以前のバージョンでは、特定の参照が外部で使用されていたということです。あなたのコードがそれらの参照を放棄してからずっと長い間かもしれませんが、名前はまだ、どこか不思議で、アセンブリで検索されています。

AssemblyInfo.csファイルに移動して、ThemeInfoを見つけます。

[Assembly: ThemeInfo(
ResourceDictionaryLocation.ExternalAssembly, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page, 
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page, 
// app, or any theme specific resource dictionaries))]

最初の場所を「なし」に変更します。

[Assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page, 
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page, 
// app, or any theme specific resource dictionaries))]

そして、例外をオンにしておいてください!私はこの答えを、このような性質のさまざまな質問に投稿します。

0
ouflak