3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

シリアライズに失敗したとき

Posted at

シリアライズに失敗したときの対応

はじめに

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);
		}
	}

}

3
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?