2011-01-07 4 views
1

のない私には、例えば、2クラスを得た:.NETバイナリシリアル条件付きISerializable

public class A 
{ 
    private B b; 
    ... 
} 

public class B 
{ 
    ... 
} 

は私がオブジェクト使用にBinaryFormatterをシリアル化する必要があります。リモーティング時にはフィールドbをインクルードしますが、ファイルにシリアル化するときはインクルードしません。ここで私は追加するものである:

[Serializable] 
public class A : MarshalByRefObject 
{ 
     private B b; 

     [OnSerializing] 
     private void OnSerializing(StreamingContext context) 
     { 
      if (context.State == StreamingContextStates.File) 
      { 
       this.b = null;   
      } 
     } 
    ... 
} 

[Serializable] 
public class B : MarshalByRefObject 
{ 
    ... 
} 

私はこれは悪いデザインだと思う別のクラスCもBが含まれている場合ので、何を決定する必要があり、クラスCに我々はA.クラスBのように重複OnSerializing()のロジックを追加する必要がありますクラスAまたはCではありません。

クラスBの変数が多すぎるため、SerializationInfoに追加する必要があるため、ISerializableインターフェイスを使用しません。

GetObjectData()& SetObjectData()で何も実行しないクラスBのSerializationSurrogateを作成し、ファイルにシリアル化するときに使用することができます。ただし、クラスBを変更する人は、シリアル化中に何が起こるか気づくことができないので、同じメンテナンスの問題& SerializationSurrogateの存在。

もっと良い選択肢はありますか?

+0

'MarshalByRefObject'では、リモートでは** **シリアル化されていません。 –

答えて

0

実際の問題はSerializable(iowはシリアル化しようとしています)MarshalByRefObject派生型を使用しています。これはオブジェクトが別のドメインに存在する場合はほとんど不可能です。

どちらか一方を使用しますが、両方を使用することはできません。

+0

返信ありがとうございます。 MarshalByRefObjectはリモート処理時に使用され、ファイルのシリアル化時には[Serializable]が使用されます。私は共存する作品を問題なくテストしました。 – SillyWhy

+0

さらに、私はMarshalByRefObjectがファイルにシリアライズできるとは思わない。 – SillyWhy

+0

ありがとう、私はこれを試したときに多くの問題に遭遇したことを思い出しますが、あなたの状況は私が実験していたものとは非常に異なる可能性があります。 – leppie

0

私は誤ってMarshalByRefObjectを持っています。これはシリアル化されないので、ファイルのシリアル化には[NonSerializable]を使用できます。

しかし、リモート処理時に値でマーシャリングするために、[Serializable]とマークされたクラスがいくつかあります。そのため、ファイルのシリアライゼーションからそれを区別する必要があります。

[Serializable] 
public class A 
{   
    private B b;  

    [OnSerializing]   
    private void OnSerializing(StreamingContext context)   
    {    
     if (context.State == StreamingContextStates.File)    
     {     
      this.b = null;      
     }   
    }  
    ... 
}  

[Serializable] 
public class B 
{  
    ... 
} 

ので[NonSerialized】この場合には役立ちません:
1)ではなく、ディスクへのリモート処理時にフィールドbをシリアル化する必要があります。
2)クラスC、D、Eなどにもフィールドbがある場合は、それらのすべてを[NonSerialized]で更新する必要があります。メンテナンス作業が多すぎます。

もっと良い選択肢はありますか?