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

标签 c# serialization deep-copy

我对 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/

相关文章:

c# - ASP.NET MVC UpdateModel 意外失败

Java:将一个列表添加到另一个列表而不复制引用

matlab - 如何在 MATLAB 中显式制作数组的深层复制?

c# - 分类时,NEST搜索元数据丢失

c# - 手动打开到 SQLite 数据库的 EntityConnection 会导致 ProviderIncompatibleException

java - Google Play 游戏服务 VS Google Drive

c# - 将 JavaScriptConverter 转换为 json.net JsonConverter

java - 使用 Externalizable 进行序列化

python - 为什么 Django Rest Framework 不鼓励模型级别验证?

c++ - 是否可以在不显式迭代每个元素的情况下深度复制指针容器?