Object Serializeをやってみた

あるオブジェクトをArrayListごとファイルに保存したくなったので、試してみた。

1. インタフェースSerializableを実装する
2. シリアライズ出来ないフィールド変数にはtransientキーワードを付ける
シリアライズ出来ないオブジェクトの宣言にtransientを付ければSerializableをimplementしていてもそのオブジェクトは無視されるようになる(Exceptionが出なくなる)一時的に使用するものに対して付けると良い
3. シリアライズ出来ないオブジェクトをなんとかしてシリアライズする
3-1. Bitmapをシリアライズする
AndroidのBitmapはそのままだとシリアライズ出来ないので、compressメソッドを使用してbyte配列にする

 transient Bitmap mBitmap;
 private byte[] mBitmapArray;

 final void serializeBitmap() {
     ByteArrayOutputStream bout = new ByteArrayOutputStream();
     icon.compress(Bitmap.CompressFormat.PNG, COMPRESS_QUALITY, bout);
     mBitmapArray = bout.toByteArray();
 }

3-2. Intentをシリアライズする
といっても、実際にはIntentオブジェクトに渡すパッケージ名とクラス名だけ別途フィールドに保持しておくだけ

 transient Intent intent;
 private String pkgname, clsname;

 <<取得したパッケージ名とクラス名をpkgname, clsnameに入れる処理>>

4. ソースを変更した時のバイナリ不一致を防ぐためserialVersionUIDを付ける
やらなくてもよいが、おかしな不具合を防ぐためにやったほうがいいに決まっている
5. ObjectOutputStream#writeObject()などを使用してストリームに乗せる
6. 読みだしてオブジェクトを復元するときはtransientをつけたオブジェクトも修復すること
例えばBitmapクラスは以下のようにして元に戻す

 final Bitmap getBitmap() {
     if (mBitmapArray == null) {
         return null;
     }
     Bitmap bitmap = BitmapFactory.decodeByteArray(mBitmapArray, 0,
     mBitmapArray.length);
     return bitmap;
 }

参考サイト
http://www.ne.jp/asahi/hishidama/home/tech/java/serial.html