我对 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;
}
使用二进制序列化进行深度克隆的辅助类(我从网上的某个地方得到了这个方法代码,不太记得在哪里了,但看起来不错)
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 没有被标记为可序列化。
但是我不想序列化 A,我想序列化 B 及其子对象 C。
我猜它也尝试序列化父对象 A,因为它在对象图中都是互连的。但是现在有什么方法可以将其排除在序列化之外吗?
最佳答案
这个快速模拟代码工作得很好,你的问题在其他地方,也许C
有类A
的变量?
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);
}
}
编辑每条评论:
请将以下内容添加到 B
中的事件
[field:NonSerialized]
这将阻止事件调用列表的序列化,而事件调用列表又引用A
关于c# - 在 C# 中的二进制序列化中排除父对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2052505/