ディープコピーメソッドを実装しました。このメソッドにステップインします。クラスは期待どおりにコピーされます。ディープコピーはメソッドにステップインするときにのみ正常に動作します
ただし、メソッドをステップ実行してクラスインスタンスを検査すると、一部のプロパティが正しくコピーされません。
Profile profile = new Profile();
profile = Model.Copy<Profile>(Profile.GetProfileById(ProfileID));
profile.Save();
上記のコードは、クラスインスタンスが作成され、コピーが呼び出された場所を示しています。
データベースに準拠しているため、コピーするプロファイルにはAddressCollection
という2つの項目があります。
profile.Save()
行にブレークポイントを置き、コピーメソッドをステップオーバーすると、インスタンスが正しくコピーされず、AddressCollection
プロパティに0個の項目があります。
実際にコピーメソッドに入ると、インスタンスは正しくコピーされ、AddressCollection
が2つの項目で返されます。
コピー方法
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;
}
私は運なしDataContractSerializer
を使用するBinaryFormatter
を変更しようとしています。 私はまた、シリアル化の代わりにリフレクションを使用しようとしましたが、同じ問題が発生します。
おそらくプロパティは「Serializable」として帰属されませんか? –
クラスは 'Serializable'です。これはプロパティには適用できません – DNKROZ
あなたはそうです。ごめんなさい。しかし、シリアライズ可能でないか、または非シリアライズ可能と見なされるいくつかのタイプの属性を持つことができます。しかし、私はあなたがすでにそれをチェックしたと思うだろう –