2009-07-16 7 views
2

コードベースでコード分析の警告を行っているうちに、私はこのコードに遭遇しました。名前を変更したいのですが、シリアル化の問題が発生するかどうかはわかりません。シリアライズ可能な点がないように見えますが、属性を削除する前に何か不足していないことを確認したいだけです。クラスIFFプロパティを持たないクラスをSerializableとしてマークするのは意味がありませんか?

[Serializable] 
public class FileIsNotReadonlyVerifier : IFileVerifier 
{ 
    #region IFileVerifier Members 
    public void Verify(FileInfo file, FlatFileTrafficSystem system) 
    { 
     if ((file.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) 
     { 
      throw new VerificationException(Resources.VerificationException_FileIsReadonly); 
     } 
    } 
    #endregion 
} 
+0

は –

答えて

5

あなたのクラスは封印されていません。誰かがサブクラス化してシリアライズする必要があるという意図がある場合は、おそらく[Serializable]を追加します。

しかし。私はではありませんを追加する[Serializable] "とちょうど"; (スレッドまたは継承のような)直列化は、が計画、設計、テストされたものでなければなりません。あなたが現在タイプをシリアライズまたはそれをシリアル化する必要を予見していない場合は、チャンスはあなたが設計していないこと/ 100%正しいである(これらのシナリオのために適切にそれをテストされますが、時間の書き込みを無駄にしてはいけません不要なコード)。

他の人があなたのクラスを使用していて、シリアライズ可能にしたい場合は、自分のローカルフィールドに[NonSerialized]とマークし、手動で(コールバック内で)処理することで可能です。 ([Serializable]の主な消費者である)多くの点BinaryFormatter

も注意してくださいそれは自体設計上の問題があり、かなり脆いです。より安定性の高い契約ベースのシリアライザがあります。

+0

契約ベースのシリアライザの場合は、WCFで実装されている構造体などを参照していますか? WCFが他のコンテキストへの使用を超えてポータブルに構築されたシリアル化コントラクトである場合、 – ramnik

+0

いずれかまたは;-p WCFデータコントラクトはWSDLを介して移植可能です。他の契約ベースのシリアライザも存在します。例えば、 "プロトコルバッファ"はバイナリシリアル化形式です(.NET版のprotobuf-net(mine; -p)とdotnet-protobufs) - これは非常に移植性がありますが、あなた自身でトランスポートを行う必要があります。 http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns –

0

は(あなたの例のように)全く状態を運ばないあなたには、いくつかのあいまいなリモート処理シナリオ(および他のいくつかの、おそらく同じように奇妙なシナリオ)のためにそれを必要としない限り、私は、それが無意味であることを、同意するだろう。

4

かつてはプロパティーを持たないemtpyタグだったXML標準(Open Travel Alliance)を使っていましたが、これはプロパティなしのコードで直列化可能なクラスとして実装されたばかりです。これは、Webサービスからの応答メッセージに使用され、サーバープロセスが成功したことを示します。

+1

(XmlSerializerをを気にしない '[Serializableを]')(コメントに返信)フープの –

7

はいserializable.Theの理由は、あなたがいない場合、あなたのタイプを使用するすべてのユーザーが、このクラスのインスタンスをシリアル化することができなくなることであるとしてこれをマークしてください。

[Serializable] 
public class MyType { 

    // Breaks serialization. 
    private readonly FileIsNotReadonlyVerifier _verifier; 

    // Might work, might break. Depends on the implementation. Have to use 
    // another context variable to serialize/deserialize this. 
    private readonly IFileVerifier _otherVerifier; 

} 

それがこのケースで動作させるための唯一の方法は、可変の非直列化可能にする状態を追跡するために別の変数を使用して、フィックスアップロジックを持つ特殊な直列化メソッドをオーバーライドすることです。

私はこの問題に数回実行した、それは非常にイライラします。特に私は、メンバーがいないカスタムストリング比較者を作成していた場所でそれを実行しました。私のタイプをシリアライズするために、私は多くのフープを飛び越えなければなりませんでした。非常にイライラ。

+0

なぜたくさん?確かに、特定のインターフェイスがあれば、それをラップすることができます。 – leppie

+0

@leppie、はい。しかし、1)別の変数とハックフィックスアップロジック、または2)シリアル化コンテナとして機能し、実際のインターフェイスへの呼び出しを代行するラッパークラスのいずれかが必要です。いずれの場合も、何もしないデフォルトよりはるかに多くの作業があります。 – JaredPar

+3

その場合は、_verifierの上に[NonSerialized]を追加し、コールバックでそれを行うだけです。 –

関連する問題