皆さんこんにちは。
今回はシリアライズ、デシリアライズを使った
Androidアプリのデータ保存を
実装したので記事にしました!
シリアライズ(直列化)とは
Javaのインスタンスをバイト列として出力すること
デシリアライズとは
バイト列をJavaのインスタンスに復元すること
良さ
シリアライズとデシリアライズを行うことで
外部にファイルとして保存することができるので
データの永続化ができます。
つまりデータベースとしても使えます!
Android開発ではSQLiteでデータの永続化をするのが一般的ですが
今回の開発ではシリアライズを使ったので紹介します。
実装
シリアライズされたオブジェクトをファイルに書き込むときは
ObjectOutputStreamを
読み込むときは
ObjectInputStreamを
使います。
実際のコード
実際のコードではFileUtilクラスを作りそこに
writeObject,readObjectメソッドを作成しています。
public class FileUtils { private static final String TAG = FileUtils.class.getSimpleName(); /** * シリアライズされたオブジェクトを読み込みます */ public static Object readObject(String path) { Object object = null; try { FileInputStream fileIn = new FileInputStream(path); ObjectInputStream inputStream = new ObjectInputStream(fileIn); object = inputStream.readObject(); inputStream.close(); } catch (FileNotFoundException e) { //読み出し元でデータがnullかどうかでエラー処理するのでここではしない LogUtils.e(TAG, "FileNotFoundException", e); } catch (IOException e) { //読み出し元でデータがnullかどうかでエラー処理するのでここではしない LogUtils.e(TAG, "IOException", e); } catch (ClassNotFoundException e) { //読み出し元でデータがnullかどうかでエラー処理するのでここではしない LogUtils.e(TAG, "ClassNotFoundException", e); } return object; } /** * シリアライズされたオブジェクトを書き込みます。 */ public static void writeObject(String path, Object data) { try { FileOutputStream fileOut = new FileOutputStream(path); ObjectOutputStream outputStream = new ObjectOutputStream(fileOut); outputStream.writeObject(data); outputStream.close(); } catch (FileNotFoundException e) { //saveができなかった場合の復旧ができないのでそのままスルーする。 //そもそも発生し得ない。 LogUtils.e(TAG, "FileNotFoundException", e); } catch (IOException e) { //saveができなかった場合の復旧ができないのでそのままスルーする。 //そもそも発生し得ない。 LogUtils.e(TAG, "IOException", e); } } }
writeObjectのdataはGsonをJsonに変えたものを入れています。
FileUtils.writeObject(FILE_PATH, new Gson().toJson(/*リスト等のデータ配列*/));
最後に
シリアライズ、デシリアライズが
データベースのように使われるケースは
最近は少ないと思いますが
この記事が誰かの役に立てば幸いです。
最後までお読みいただきありがとうございました!