この記事では、Pythonでクラスのシリアライゼーション(シリアライズ)とデシリアライゼーション(デシリアライズ)を行う方法について深く探ります。具体的なコード例とその解説、応用例を含めています。
目次
はじめに
シリアライゼーションとは、オブジェクトやデータ構造を一定の形式に変換するプロセスを指します。デシリアライゼーションはその逆で、シリアライズされたデータを元のオブジェクトやデータ構造に戻すプロセスです。Pythonでこれらの処理を行う方法としていくつかの方法がありますが、今回は特にクラスに焦点を当てて解説します。
基本的なシリアライズとデシリアライズ
jsonモジュールを使用する方法
Python標準ライブラリにあるjsonモジュールを使って、クラスをシリアライズとデシリアライズを行います。
import json
class MyClass:
def __init__(self, name, age):
self.name = name
self.age = age
# オブジェクトを辞書に変換
def obj_to_dict(obj):
return obj.__dict__
# 辞書をオブジェクトに変換
def dict_to_obj(d):
return MyClass(d['name'], d['age'])
# シリアライズ
my_obj = MyClass('John', 30)
serialized_obj = json.dumps(my_obj, default=obj_to_dict)
# デシリアライズ
deserialized_obj = json.loads(serialized_obj, object_hook=dict_to_obj)
print(deserialized_obj.name) # Output: John
print(deserialized_obj.age) # Output: 30
この例では、`MyClass`という簡単なクラスを定義し、`json.dumps()`と`json.loads()`関数でシリアライズとデシリアライズを行っています。
__dict__属性を使う方法
Pythonのオブジェクトは、`__dict__`属性を持っています。この属性を直接利用することで、シリアライゼーションとデシリアライゼーションが可能です。
class MyClass:
def __init__(self, name, age):
self.name = name
self.age = age
# シリアライズ
my_obj = MyClass('Jane', 25)
serialized_obj = json.dumps(my_obj.__dict__)
# デシリアライズ
deserialized_obj_dict = json.loads(serialized_obj)
deserialized_obj = MyClass(**deserialized_obj_dict)
print(deserialized_obj.name) # Output: Jane
print(deserialized_obj.age) # Output: 25
応用例
複数のオブジェクトのシリアライズ
シリアライズとデシリアライズは、一つだけでなく複数のオブジェクトにも適用できます。
objects = [MyClass('Alice', 28), MyClass('Bob', 34)]
# シリアライズ
serialized_objects = json.dumps([ob.__dict__ for ob in objects])
# デシリアライズ
deserialized_objects_dict = json.loads(serialized_objects)
deserialized_objects = [MyClass(**d) for d in deserialized_objects_dict]
継承を含むクラスのシリアライズ
クラスが継承を含む場合でも、同様にシリアライズとデシリアライズは可能です。
class Person:
def __init__(self, name):
self.name = name
class Employee(Person):
def __init__(self, name, job_title):
super().__init__(name)
self.job_title = job_title
employee = Employee('Dave', 'Developer')
# シリアライズ
serialized_employee = json.dumps(employee, default=lambda o: o.__dict__)
# デシリアライズ
deserialized_employee_dict = json.loads(serialized_employee)
deserialized_employee = Employee(**deserialized_employee_dict)
複数のデータ形式でのシリアライズ
`pickle`や`yaml`といった他のシリアライズ可能なフォーマットを使っても、同様の操作が可能です。
import pickle
# シリアライズ
with open('my_class.pkl', 'wb') as f:
pickle.dump(my_obj, f)
# デシリアライズ
with open('my_class.pkl', 'rb') as f:
deserialized_obj = pickle.load(f)
まとめ
Pythonにおけるクラスのシリアライゼーションとデシリアライゼーションは、多くの方法と応用例で実現できます。これを機に、シリアライゼーションとデシリアライゼーションをうまく活用して、より効率的なプログラミングを行いましょう。
コメント