【发布时间】: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