2011-01-07 27 views
1

我得到2類,例如:.NET二進制序列有條件而不ISerializable的

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

public class B 
{ 
    ... 
} 

我需要將對象序列A,使用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類,我們必須邏輯添加重複OnSerializing()爲A. B級應該決定什麼但不是A類或C類。

我不想使用ISerializable接口,因爲在類B中有太多變量必須添加到SerializationInfo中。

我可以爲B類創建一個SerializationSurrogate,它在GetObjectData()& SetObjectData()中不執行任何操作,然後在序列化到文件時使用它。然而,同樣的維護問題是因爲修改B類的人不能注意到SerializationSurrogate的存在會在序列化過程中發生什麼。

有沒有更好的選擇?

+0

隨着'MarshalByRefObject',它**不是**序列化時遠程... –

回答

0

真正的問題是在這裏使用的是Serializable(試圖序列化)MarshalByRefObject派生類型,如果對象居住在另一個域中,這是幾乎不可能的。

使用其中一種,但不能同時使用。

+0

感謝您的答覆。當文件序列化時使用遠程處理和[Serializable]時使用MarshalByRefObject。我已經測試了兩個共存的作品沒有問題。 – 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 
{  
    ... 
} 

[非序列化]沒有在這種情況下幫助,因爲:
1)需要遠程處理時,序列化字段B而不是磁盤。 2)如果C類,D類,E類等也有字段b,則必須用[NonSerialized]更新所有字段。維護任務過多。

有沒有更好的選擇?

相關問題