【问题标题】:Deep copy only works properly when stepping into method深拷贝只有在进入方法时才能正常工作
【发布时间】:2017-06-19 10:10:33
【问题描述】:

我已经实现了一个深拷贝方法,当单步执行这个方法时 - 类被按预期复制。

但是,如果我跳过该方法并检查类实例,则某些属性未正确复制。

Profile profile = new Profile();
profile = Model.Copy<Profile>(Profile.GetProfileById(ProfileID));
profile.Save();

上面的代码显示了类实例的创建位置和副本的调用位置。

与数据库一致,我需要复制的配置文件在AddressCollection属性中有2项。

如果我在profile.Save() 行上设置断点并跳过复制方法,则无法正确复制实例并且AddressCollection 属性有0 个项目。

但是,如果我实际进入复制方法,实例会被正确复制并返回带有 2 个项目的 AddressCollection

复制方法

public T Copy<T>(T oldObject) where T : CRMBusinessObjectBase
{
    return Copy<T>(oldObject, null, null);
}

public T Copy<T>(T oldObject, CRMBusinessObjectBase parentObject, string parentProperty) where T : CRMBusinessObjectBase
        {
            //Create copy of business object
            T copy = null;

            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter sz = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

            //Serialize and then deserialize to a new object
            using (MemoryStream ms = new MemoryStream())
            {
                sz.Serialize(ms, oldObject);
                ms.Position = 0;
                copy = (T)sz.Deserialize(ms);
            }

            //Set business object as new
            copy.SetAsNew();

            //Set parent property if specified
            if (parentObject != null && !string.IsNullOrEmpty(parentProperty))
            {
                copy.GetType().GetProperty(parentProperty).SetValue(copy, parentObject, null);
            }

            return copy;
        }

我尝试将BinaryFormatter 更改为使用DataContractSerializer,但没有任何运气。 我也尝试过使用反射而不是序列化,并且出现了同样的问题。

不太确定问题出在哪里。

截图

复制前 复制后

【问题讨论】:

  • 也许属性不属于Serializable
  • 类是Serializable,这不能应用于属性
  • 是的,它们都是可序列化的。这很奇怪,因为当我踏入它时该方法实际上有效,但当我跨过它时却不起作用。一点意义都没有!
  • 您的监视窗口中有任何条目吗? msdn.microsoft.com/en-us/library/aa290869(v=vs.71).aspx
  • 当您通过它进行调试时,使用 Watches 等,它正在访问可能急切加载某些属性/集合等的对象的属性。如果没有悬停或 Watch 窗口,则不会发生这种情况。另见stackoverflow.com/questions/20760541/…

标签: c# serialization copy clone deep-copy


【解决方案1】:

此问题可能与使用 Watch 窗口或调试时将鼠标悬停在变量上有关。

http://dotdotnet.blogspot.com.au/2010/04/lazy-load-eager-debugging.html

另一件事是调试器,特别是 Visual Studio Watch 窗口对延迟加载不太友好,因为 Watch 窗口尝试 评估导致所有懒惰的每个属性的值 正在加载要加载的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 2011-04-26
    • 2012-04-12
    • 2013-09-07
    • 1970-01-01
    相关资源
    最近更新 更多