🐣

Python シリアライズ

2022/05/27に公開

業務形態に応じて、適切なシリアライズが存在するはずです。
上記のクラスを用いて様々なシリアライズ(永続化)を検証してみましょう。

↓ シリアライズ化したいオブジェクト

class
import datetime
import json

class AppAccount:
    """
    アカウント情報のクラス
    """

    def __init__(self, login_id: str, name: str, register_date: datetime.datetime) -> None:
        self.login_id: str = login_id
        self.name: str = name
        self.register_date: datetime.datetime = register_date

    def get_json(self):
        return json.dumps({"ID": self.login_id,
                           "名前": self.name,
                           "登録日": str(self.register_date)},
                          ensure_ascii=False)

このクラスはアカウントの情報を保持する役割とJSON形式で出力する役割があります。
(永続化を検討するため、かなりデータクラスに近い構造にしています。)

ファイル保存系

pickle

※AppAccountクラスの記載は省略しています。

test.py
import pickle

# インスタンスを作る
account = AppAccount("25ttuehkfdor", "山田 太郎", datetime.datetime(2022, 3, 21))

# 永続化
with open('account.pickle', 'wb') as f:
    pickle.dump(account, f)

# ファイルから呼び出す
with open('account.pickle', 'rb') as f:
    load_account = pickle.load(f)
    print(load_account.get_json())

メリットは何といっても、保存したオブジェクトから、データを取得するだけでなく、メソッドも実行可能であるということです。保存の仕方であれば、オブジェクト指向の原則に沿ってそのまま使用することができます。 使用例としてはAIの学習モデルとして利用されることが多いです。
sys.getsizeofでオブジェクトのサイズも確認してみます。

byte
(メモリ上)オブジェクト 56
(ディスク上)pickleファイル 162

デメリットとしては、メソッド(振る舞い)を多く(複雑)に実装すればするほど、保存するときのサイズが大きくなることでしょうか。もちろんRDBではないのでSQLは使えません。

JSONファイル

test.py
import json

# 永続化
with open('account.json', 'w') as f:
    f.write(account.get_json())

# ファイルから呼び出す
with open('account.json', 'r') as f:
    load_account = f.read()
    print(load_account)

byte
(メモリ上)オブジェクト 56
(ディスク上)pickleファイル 76

JSON形式は非常に多くのライブラリや(WEB)APIに対応しており、汎用性が高いです
またpickleよりはファイルのサイズが小さくなることが想定されます。
デメリットは、JSON形式にするので、メソッドの情報は永続化されません。読み込む側のオブジェクトが、振る舞いを持つ必要があります。これもRDBではないのでSQLは使えません。

DB系

記載予定...

Discussion