2010-01-12 66 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级的事件处理程序订阅了它。如果我取消订阅事件处理程序,序列化将起作用。

我的错误不张贴整个代码的情况,对不起:(

相关问题