シリアライズ(直列化)を使ってAndroidアプリデータを保存する【Java】

皆さんこんにちは。

今回はシリアライズ、デシリアライズを使った

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(/*リスト等のデータ配列*/));

最後に

シリアライズ、デシリアライズが

データベースのように使われるケースは

最近は少ないと思いますが

この記事が誰かの役に立てば幸いです。

最後までお読みいただきありがとうございました!

コメントを残す

メールアドレスが公開されることはありません。