yuu_nkjm blog
2010-07-13(Tue) [長年日記]
[Java] Javaでapache.commons.lang.SerializationUtils.clone()を使ったディープコピー(Deep Copy)
ディープコピー(Deep Copy)とシャローコピー(Shallow Copy)の区別がつかずにやられるのは誰もが通る道.標準ライブラリを使って自前で実装するのもありだけど,apache.commons.lang.SerializationUtils.clone()を使うのが簡単っぽい.こちらのページには,シャローコピーの例も出ている.
deepCopy関数の内側でキャストするのも良いと思うけど,DataManagerクラス内で,いろんなオブジェクトのdeepCopyをしたかったので,キャストはdeepCopy関数の外側にした.これだと,SerializationUtils.clone()を直接呼ぶのと変わらないんだけど,何をしているかを自分にとって分かりやすくしたかった.
import org.apache.commons.lang.SerializationUtils;
import java.io.Serializable;
public class DataManager {
private EleSimulationState simulationState;
private List histories;
public void finalizeSimulationState() {
histories.add(simulationState);
this.eleSimulationState = (SimulationState) deepCopy(this.simulationState);
}
public Object deepCopy(Serializable state) {
Object dest = SerializationUtils.clone(state);
return dest;
}
}
cloneする対象はSerializableをimplementsする.
public class SimulationState implements Serializable{
private Map<Id, Facility> facilities;
private Map<Id, Vehicle> vehicles;
}
cloneする対象のメンバ変数に含まれるクラスはSerializableをimplements(interface定義ならextends)する.
public interface Facility extends Serializable{}
public interface Vehicle extends Serializable{}
シリアライズ(直列化)の対象から外したいメンバ変数には,transientという修飾子をつける.
参考文献
XStreamを使ったdeep copy
com.thoughtworks.xstream.XStreamというライブラリでもディープコピーが出来るらしい.以下のページには,「XStreamなら、対象のオブジェクトがSerializableを実装していなくても書き出せるのがポイントですね。」と書かれている.
- https://www.google.co.jp/ ×1323
- https://www.google.com/ ×31
- https://www.google.co.jp/ ×14
- https://github.com/ ×2
- https://www.google.com.sg/ ×2
- https://www.google.com/search ×2
- https://www.google.co.kr/ ×2
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×2
- http://search.fenrir-inc.com/?q=SerializationUtils... ×2
- http://travel.rakuten.co.jp/package/ ×1
- http://search.yahoo.co.jp/ ×1
- http://nortonsafe.search.ask.com/web?geo=JP&prt=NI... ×1
- https://www.google.co.jp/webhp?source=search_app ×1
- https://www.google.com.tw/ ×1
- http://search.fenrir-inc.com/?q=xstream interface&... ×1
- http://docomo.ne.jp/cp/as-rslt.cgi?pno=4&key=吉田さかみ... ×1
- http://clockmaker.jp/blog/2009/09/blogopolis/ ×1
- https://www.google.co.uk/ ×1
- http://rankbuilder2.net/ ×1
- https://www.google.co.nz/ ×1
- SerializationUtils ×111 / SerializationUtils.clone ×27 / java deepcopy ×14 / java clone ディープコピー ×8 / org.apache.commons.lang.SerializationUtils ×7 / java SerializationUtils ×6 / java ディープコピー ×6 / SerializationUtils ディープ コピー ×5 / java serializationutils ×5 / serializationutils.clone ×5 / Java オブジェクト コピー ライブラリ ×5 / java clone commons ×4 / java SerializationUtilsとは ×4 / SerializationUtils clone ×4 / serializationutils clone ×4 / serializationutils ×4 / SerializationUtils ディープコピー ×3 / HashMap ディープコピー 簡単 方法 ×3 / java クラスオブジェクト ディープコピー ×3 / SerializationUtils.clone() ×3 / apache commons clone ×3 / org apache serializationUtils ×3 / java deep copy ×3 / java ディープクローン ×3 / import org.apache.commons.lang.SerializationUtils; ×3 / deep copy java apache ×3 / deepcopy java ×3 / commons deepcopy ×3 / java apache lang シャローコピー ×2 / java clone commons deep ×2 / java arraylist ディープコピー apatch ×2 / SerializationUtils clone deep copy ×2 / org.apache.commons.lang.SerializationUtils メモリリーク ×2 / deepcopy shallowcopy java commons ×2 / java map clone ×2 / calendar clone ディープ ×2 / xstream apache ×2 / android ディープコピー apache ×2 / java serializationutils classnotfound ×2 / apache commons deepcopy ×2 / java clone コピー ×2 / SerializationUtils eclipse ×2 / java object ディープコピー ×2 / apache java オブジェクトのコピー ×2 / java ディープコピー SerializationUtils ×2 / Java ディープコピー Clone ×2 / Java SerializationUtils ×2 / Java 簡単 Clone ×2 / apache clone ×2 / commons-lang ディープコピー ×2 / clone deepcopy ×2 / SerializationUtils.clone ディープ ×2 / SerializationUtils Serializable ×2 / java ディープコピー hashmap ×2 / serializationutils.clone Native ×2 / java commons copy ×2 / ディープコピー java apache ×2 / apache.commons.lang.SerializationUtils.clone ×2 / java ディープコピー serialize ×2 / SerializationUTis ×2 / commons Mapコピー ×2 / lang.SerializationUtils ×2 / request サーブレット ディープコピー ×2 / apache commons lang serialize ×2 / SerializationUtils List ×2 / serializationutil ×2 / java ディープコピーの問題点 ×1 / swing シリアライズ windows linux ×1 / hashmap java ディープ ×1 / java deepcopy 簡単 ×1 / commons lang serialize ×1 / common map copy ×1 / org.apache.commons.lang コピー ×1 / apache clone ディープコピー ×1 / SerializationUtils Error ×1 / java commons clone ×1 / java collection deepcopy ×1 / 優木まおみ ×1 / deep copy apache ×1 / shallow deep java clone ×1 / Java commons io シリアライズ ×1 / .SerializationUtils; ×1 / apache commons serializable copy ×1 / java clone eclipse ×1 / apache commons HTML タグ ×1 / java for ディープコピー ×1 / java commons map コピー ×1 / java ディープコピー Serializable ×1 / java list コピー commons ×1 / commons lang clone ×1 / deepcopy serialicationutils ×1 / シャローコピー ×1 / SerializationUtils.clone ClassNotFoundException ×1 / java list SerializationUtils.clone ×1 / commons clone ×1 / xstream シリアライズ transient ×1 / ディープコピー java ×1 / clone java commons ×1 / apache SerializationUtils ×1 / svn deepcopy 使い方 ×1