2009-06-30 5 views
33

What is the correct way to make a custom .NET Exception serializable?
Are all .NET Exceptions serializable?を参照する...私は常に例外を[シリアル化可能]にする必要がありますか? (.NET)

はなぜ私の例外は、シリアライズすべきですか?
第三者のライブラリで定義されたカスタム例外が直列化できない場合、「バグと見なすことができます」と言われました。どうして?

この点について、他のクラスと例外が異なるのはなぜですか?

答えて

48

異なるAppDomains間で例外をマーシャリングする必要があり、(正しく)シリアライズできない場合、貴重なデバッグ情報が失われる可能性があります。他のクラスとは異なり、例外がマーシャリングされるかどうかを制御することはできません。


「あなたはコントロールできません」というのは、作成するクラスには一般に有限の空間があり、その存在はよく知られているということです。戻り値で、別のAppDomain(または別のマシン)で呼び出すと、フォールトが発生し、「そのように使用しないでください」と言うことができます。呼び出し元は、メソッド呼び出しをラップすることによって、シリアル化できる型に変換する必要があることを認識します。しかし、例外がキャッチされなければ非常に上にバブリングされるので、あなたはあなたが知っていなかったAppDomainの境界を超越することができます。別のAppDomainの20レベルの深刻なカスタムアプリケーション例外がMain()で報告された例外である可能性があり、その途中で何もあなたのための直列化可能な例外に変換することはありません。この場合には例外は、シリアライズ/ deserializableにする必要があるTalljoeの回答に加えて、あなたの例外は、同様にWebサービスを通過することができる

+0

本当に良い答えです。 – Cheeso

+2

これが実際に起こる可能性のある特定の状況/例について考えることができますか? – Sam

0

、それはXMLになって、Webサービスによって

+3

ジェフリー:あなたはほぼ正しいです。例外がWebサービス上で「送信」されると、すべてが必ずしも直列化されるわけではありません。実際にはSOAPフォルトに変換されるため、完全な忠実性は必要ありません。また、古いASMXサービスで使用されていたXMLシリアライザは、[Serializable]にほとんどまたはまったく注意を払っていません。 –

0

を送信することができるので、私は、明示的に直列化できないクラスが含まれていない限り、すべてのクラスのデフォルトはSerializableでなければならないと考えてください。あるデザイナーがそれについて考えなかったからといって、クラスを移すことができないのは面倒です。

「Final」と同じことですが、「Mutable」と具体的に言わない限り、すべての変数はデフォルトで「Final」にする必要があります。

また、プライベートではない変数を持つことは意味がありません。

まあ、自分の言語を設計する必要があります。

しかし答えは、あなたの例外がどのように使用されるのかわからず、リモート呼び出しを介してスローされることができると想定されています。

+1

@Bill:あるいは、デザイナーはそれについて考えるのですが、シリアライゼーションのサポートに反対しました。たとえば、ハンドルを保持するクラスをネイティブリソースにシリアライズしたり、ストリームを開くだけではどうでしょうか? –

+0

例外は例外ではありません。また、先月(例外を含む)に連載していた3つのクラスには、このような制限はありませんでした。変更不可能なAPIを設計した委員会ではあくまでもその仕様ではありませんでした。 –

+1

ああ、デフォルトの提案では、私のシリアライズ可能なものとして、あなたがそれらの条件を持っていれば、リソースはあなたのクラスまで連鎖する " "一時的"とタグ付けしない限り、それを直列化できないので、現在のシステムよりもうまく動作します。 –

-1

オブジェクトがシリアライズ可能な別の場所は、Asp.Netセッションです。 最後の例外をSessionに格納します。直列化可能ではない例外は、直列化可能なものとして内部の例外を指定するために余分な変換が必要です。

+0

これは、あなたのユースケースで例外をsdrializableする必要がある理由のように思えますが、一般的な質問には本当に答えません。 – stakx

+0

@stakx、あなたがコードを書くときには、使用できるさまざまなユースケースを考慮する必要があります –

関連する問題