2010-01-12 20 views
2

我在C#中關於二進制序列化問題排除父對象上的二進制序列化在C#

我需要能夠對B類的深克隆對象(與課程的圖這一切的子對象一起)。我想通過使用二進制序列化來實現這一點。如果這是最好的方法,討論在這個問題的背景下是無關緊要的。

說我有這個類的結構:

public class A 
{ 
    private B objB; 
} 

[Serializable] 
public class B : ICloneable 
{ 
    private C objC1; 
    private C objC2; 

    public object Clone() 
    { 
     B clone = Helper.Clone<B>(this); 
     return (B)clone; 
    } 
} 

[Serializable] 
public class C 
{ 
    int a; 
    int b; 
} 

深克隆二進制序列的輔助類(我得到這個方法的代碼從什麼地方上了網,真的不記得在哪裏TBH,但看起來好吧)

public static class Helper 
{ 
    public static T Clone<T>(T OriginalObject) 
    { 
     using (Stream objectStream = new MemoryStream()) 
     { 
      IFormatter formatter = new BinaryFormatter(); 
      formatter.Serialize(objectStream, OriginalObject); 
      objectStream.Seek(0, SeekOrigin.Begin); 
      return (T)formatter.Deserialize(objectStream); 
     } 
    } 

} 

所以,在我的應用程序的某個時刻,我打下面的代碼:

B clone = (B)objA.objB.Clone(); 

問題在於調試器呻吟A類未被標記爲可序列化。

但我不希望序列化,我想序列B和它的子對象C.

我想它會嘗試序列化對父對象的太多,因爲這一切都在對象圖互連。但有什麼辦法可以排除它在這一點上被序列化?

回答

2

這個快速模擬代碼工作得很好,你的問題在其他地方,也許CA類的變量?根據註釋

public class A 
{ 
    private B bObj = new B(); 

    public A() 
    { 
     B copy = bObj.Clone() as B; 
    } 
} 
[Serializable] 
public class B : ICloneable 
{ 
    private int test = 10; 

    public object Clone() 
    { 
     return Helper.Clone(this); 
    } 

} 

編輯:

請添加以下到您eventB

[field:NonSerialized] 

這將防止這反過來引用A

+0

我仔細檢查了,沒有參考無論是從B到A或從C到A ... 有一件事是,B包含一個公共事件字段,A中的事件處理程序會監聽這個事件嗎? – tjeuten 2010-01-12 22:15:54

+0

@tjeuten,是的,事件就是這樣試圖序列化調用列表,請看我編輯的答案 – 2010-01-12 22:20:20

+0

thx a zillion做了詭計! – tjeuten 2010-01-12 22:26:22

1

如果B不保存對任何參考,序列B就不需要是即使有B.

參考從您的代碼示例序列化,B不成立至A,因此任何引用它應該工作。你確定你提供的代碼示例真的代表你的真實場景嗎?

0

林不知道,但如果你把它標記爲nonserializable?我會測試:P

+0

試過,但標誌着一類非序列化是不允許的,只是領域 – tjeuten 2010-01-12 21:35:05

0
事件的調用列表的系列化

在這裏必須有別的東西在玩 - 你的代碼編譯和執行沒有問題(因爲它應該 - 類型A不是類型B's對象圖的一部分)。

是否有可能objB實際上是A類型的實例?

0

所有答覆好,謝謝,我確實發現了問題...

B類包含一個公共事件現場,並在A級的事件處理程序訂閱了它。如果我取消訂閱事件處理程序,序列化將起作用。

我的錯誤不張貼整個代碼的情況,對不起:(