gpt4 book ai didi

c# - 在 C# 中排除二进制序列化的父对象

转载 作者:行者123 更新时间:2023-11-30 22:47:55 25 4
gpt4 key购买 nike

我对 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 没有被标记为可序列化。

但是我不想序列化A,我想序列化B,它是子对象C。

我猜它也试图序列化父对象 A,因为它在对象图中都是相互关联的。但是现在有什么方法可以将它排除在序列化之外吗?

最佳答案

这个快速模拟代码工作得很好,你的问题在别处,也许 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);
}

}

根据评论编辑:

请将以下内容添加到 B 中的 event

[field:NonSerialized]

这将防止序列化事件的调用列表,而该事件又引用 A

关于c# - 在 C# 中排除二进制序列化的父对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2052505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com