シリアライズに失敗したときの対応
はじめに
Java の話です。
オブジェクトをシリアライズしたい場合は、
インターフェースに、Serializable をつければ、シリアライズされます。
とはいえ、Serializableをつけてもシリアライズされなかった場合はどうすればいいのか、そのときのメモです。
シリアライズとは
そもそも、シリアライズ処理とは、復元可能な文字列に変換することです。
Objectのような、メモリ空間にしか存在しないものを、読み込めるようにする際に利用します。
(詳細は下記)
https://docs.oracle.com/javase/jp/8/docs/api/java/io/Serializable.html
Redis等でObject情報を保持したいときに、一度シリアライズする(もちろん、シリアライズする方法をとる必要はない)
などして、オブジェクト情報を保持することが可能です。
シリアライズの復元に失敗するとき
しかし、複雑なObject情報があり、シリアライズできないというJDK系のExceptionが発生したり、
不要な変数情報をシリアライズして、性能劣化になっている場合、
個別にシリアライズ対象のものを指定することが可能です。
このとき、利用できるものが
Externalizable
になります。
public class HogeModel implements Externalizable {
/**
* 独自シリアライズ処理
*
* @param out 出力ストリーム
* @throws IOException IOエラー
*/
@Override
@SuppressWarnings("resource")
public void writeExternal(final ObjectOutput out) throws IOException {
Packer pk = MessagePackManager.getInstance().createPacker((OutputStream) out);
pk.write(this.hogehoge);
}
/**
* 独自デシリアライズ処理
*
* @param in 入力ストリーム
* @throws IOException IOエラー
*/
@Override
public void readExternal(final ObjectInput in) throws IOException {
try {
@SuppressWarnings("resource")
Unpacker upk = MessagePackManager.getInstance().createUnpacker((InputStream) in);
this.hogehoge = upk.readInt();
} catch (IOException e) {
throw e;
} catch (Exception e) {
throw new IOException(e);
}
}
}