代码之家  ›  专栏  ›  技术社区  ›  Mathieu

C中二进制序列化时排除父对象#

  •  2
  • Mathieu  · 技术社区  · 15 年前

    我有一个关于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,因为它在对象图中都是相互连接的。但是,在这一点上,是否有任何方法可以将其排除在序列化之外?

    5 回复  |  直到 8 年前
        1
  •  2
  •   Stan R.    15 年前

    这个快速模拟代码工作得很好,您的问题可能在其他地方。 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);
        }
    
    }
    

    按注释编辑:

    请将以下内容添加到您的 event 在里面 B

    [field:NonSerialized]
    

    这将阻止事件调用列表的序列化,而该事件反过来引用

        2
  •  1
  •   Jeff Cyr    15 年前

    如果b不包含对a的任何引用,则序列化b将不要求a可序列化,即使a引用b。

    从代码示例中,B不包含对A的任何引用,因此它应该可以工作。您确定您提供的代码示例确实代表了您的真实场景吗?

        3
  •  0
  •   Francisco Noriega    15 年前

    我不确定,但是如果你把它标为不可序列化呢?我要测试一下:P

        4
  •  0
  •   Andrew Hare    15 年前

    这里一定还有别的东西在起作用-你的代码编译和执行时没有问题(正如它应该的那样-键入 A 不是类型的一部分 B's 对象图)。

    有没有可能 objB 实际上是类型的实例 ?

        5
  •  0
  •   Mathieu    15 年前

    好的,谢谢所有的回复,我确实找到了问题…

    类B包含一个公共事件字段,并订阅了类A中的事件处理程序。如果我取消订阅事件处理程序,则序列化工作正常。

    我的错误是没有发布整个代码情况,对不起:(

    推荐文章