2012-01-03 12 views
1

私は[Synchronization]属性でスレッドセーフにした小さなクラスを持っていますが、ContextBoundObjectインターフェイスも実装しています。このクラスを[Serializable]にしたいと思います。コードはコンパイルされますが、私はシリアライズ可能と同期

System.Runtime.Remoting.RemotingException: Remoting cannot find field '__identity' on type 'System.MarshalByRefObject' 

例外を受け取ります。私は[同期]でマークされたクラスはいくつかの 'リモート'プロキシ経由でアクセスされていることを知っていましたが、デフォルトのシリアル化メカニズムがうまく動作することを期待しました。

これは小さなアプリケーションです。クラスは実際のリモーティングが行われないように、メモリ内シーケンス(整数ID)ジェネレータです。私は他の手段(キーワードをロックする)で同期することができると思いますが、私はこの問題の標準的な解決策が何であるか知りたいと思います。

最後に更新:私は[シンクロナイゼーション]属性を放棄して、基本的なシリアライゼーションを使用しました。

答えて

1

代わりにちょうどSerializableの属性を使用しての、あなたがISerializableインターフェイスを実装することができます。

あなたはここでそれについての詳細を読むことができます:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspxは、基本的には、1つの方法を実装する必要があります - GetObjectData - と同様のシグネチャを持つコンストラクタを。

0

シリアル化されるべきでないプロパティには、[NonSerialized]とマークします。

「カスタムシリアル化」も参照してください。 [Serializable]としてクラスをマークすることに加えて、あなたはこのように、ISerialiableを実装し、カスタムコンストラクタを追加する必要があります:

[Serializable] 
public class Foo : ISerializable 
{ 
    // custom deserialization constructor] 
    public Foo(SerializationInfo info , StreamingContext context) 
    { 
    //Get the values from info and assign them to the appropriate properties 
    } 

    public void GetObjectData(SerializationInfo info , StreamingContext context) 
    { 
    // populate info with appropriate key/value pairs. 
    // Don't forget to explicitly serialize/deserialize and contained complex objects/structures 
    } 

} 
関連する問題