TIPS配列やオブジェクトを複製する際にディープコピーを行うには、BinaryFormatterクラスやサードパーティー製のシリアライザーを使用してシリアライズ/デシリアライズするとよい。Development]連載目次オブジェクトの複製を作るCloneメソッドは、いくつものクラスに実装されている(System名前空間のICloneableインタフェースを実装しているもの)。TIPS:配列の複製を作るには?(シャローコピー編)[C#/VB]」で解説したように、Cloneメソッドはシャローコピーである(参照だけを複製する)。Cloneメソッドを持たないクラスも多い。コピー対象になるオブジェクトの全てがシリアライズ可能であれば、簡単に実現できる。本稿ではその方法を解説する。Frameworkの最初からあるものだが、本稿はそれ以降の内容も含んでいる。2015(またはそれ以降)が必要である。ディープコピーするには?コピー対象になる全てのオブジェクトがシリアライズ可能であれば、シリアライズしてからデシリアライズすればよい。具体的には、次のコードに示すDeepCloneメソッドのような実装をする。ここでは、プライベートなメンバ変数などもシリアライズできるBinaryFormatterクラスを使い、拡張メソッドにしている。CoreやUWP/Xamarinなどでは方法が異なる(後述)。Moduleディープコピーを行う拡張メソッドの例(上:C#、下:VB)BinaryFormatterクラスは、参照先のオブジェクトも含めてシリアライズする。プライベートなメンバ変数やプロパティであっても、シリアライズしてくれる。このようにメモリ上にシリアライズしたものをデシリアライズすれば、元のオブジェクトとは独立した別のものとして復元される。参照先も含めてディープコピーしたことになるのだ。上記のDeepCloneメソッドを使うコンソールアプリの例を次のコードに示す。TIPS:配列の複製を作るには?(シャローコピー編)[C#/VB]」の「シャローコピーであることを確かめる」に掲載したコードと見比べてほしい。この方法で、配列だけでなく、Cloneメソッドを持たないList<T>クラスなどのジェネリックコレクションもディープコピーできる。TIPS:配列の複製を作るには?(シャローコピー編)[C#/VB]」掲載のシャローコピーのサンプルコードとの主な違いは、次の2点だ。シリアライズ可能にするため、SampleDataクラスにSerializable属性を付けた。Cloneメソッドの呼び出しを、DeepCloneメソッドの呼び出しに変更した。DeepCloneメソッドを定義した名前空間と異なる名前空間にあるコードから呼び出すときは、名前空間のインポートが必要である。1.xにはBinaryFormatterクラスがない。そこで、サードパーティー製のシリアライザーを使うとよい。次のコードに、MsgPack.Cliを使ったDeepClone拡張メソッドの例を示す(C#のみ)。MsgPack.Cliは比較的古くからあるシリアライザーで、PCLやXamarinのプロジェクトにはNuGetから導入できる。UWPのプロジェクトにはソースコードを組み込む必要があってちょっと使いにくい。C#など)、いろいろと試してみてほしい。1.xにはSerializable属性もないので、シリアライズ対象のクラスにはSystem.Runtime.Serialization名前空間のDataContract属性とDataMember属性を使う(次のコード)。Frameworkのものと同じだ。コードは割愛するが、SampleDataクラスの配列をディープコピーするUWPアプリの例を次の画像に示しておく。Framework用のコードでWriteLineメソッドを使ってコンソールに出力していたところを、UWPアプリのTextBoxコントロールに書き出すようにしたもの。まとめシリアライズ可能なオブジェクトであれば、BinaryFormatterクラスを利用してディープコピーできる。Coreでは、サードパーティー製のシリアライザーを使うとよい。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。