2012-01-19 10 views
6

私は、シリアライズ/デシリアライゼーション(メモリとバックへの)を介してオブジェクトの深いクローンを扱うSOと他の多くのソリューションを見つけました。シリアライゼーションのないオブジェクトのクローニング

クローンを作成するクラスには、[Serializable]とマークする必要があります。 DataContractSerializerをXMLにシリアライズするために、[DataContract]とマークされたクラス(ほとんどのもの)を持っています。

私は[Serializable]属性を導入しました。これらのクラスインスタンスの一部の深いクローンが必要なためです。しかし、現在では、DCSを介したシリアライゼーション/デシリアライゼーションには何も起こりません。なぜなら、デシリアライズ時に別のXML要素が必要になるというエラーです。 [Serializable]を削除した場合、エラーはなくなります。

私のオプションは何ですか?私はただオブジェクトを可能な限りシンプルに深くクローンしたいだけです。

+0

リフレクションを使用することもできますが、パフォーマンスにもわずかなオーバーヘッドが発生する可能性があります。 – IDWMaster

+0

なぜ[Serializable]が必要なのですか?あなたは深いクローンのためにDCSを使うことができます...? DCS経由でMemoryStreamにシリアル化するだけです...? –

+0

はい私はちょうど何かを思い付いた、私はそれを投稿します – mare

答えて

9

この

public static T DeepClone<T>(this T a) 
    { 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      DataContractSerializer dcs = new DataContractSerializer(typeof(T)); 
      dcs.WriteObject(stream, a); 
      stream.Position = 0; 
      return (T)dcs.ReadObject(stream); 
     } 
    } 
1

JSONシリアライズとデシリアライズが動作するはず作品、それがシリアル化アノテーションを持っているクラスを必要としません。

public static T DeepCopy<T>(this T source) 
{ 
    return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source)); 
} 
関連する問題