Pythonにおけるバイナリデータとオブジェクトのシリアライゼーションについて解説します。具体的なコード例、その詳細解説、および応用例を含めています。この知識を使えば、複雑なデータ構造を効率的に保存、転送、復元することが可能になります。
目次
バイナリデータとオブジェクトのシリアライゼーションとは
シリアライゼーションとは、データ構造やオブジェクトを一定の形式に変換して保存したり、ネットワーク越しに送信する手法を指します。バイナリデータ形式は、データサイズを削減できるメリットがありますが、可読性が低く、デバッグが難しいデメリットもあります。
Pythonでのシリアライゼーションの方法
Pythonでは主に`pickle`モジュールがシリアライゼーションに使われます。基本的な用法は非常にシンプルです。
基本的な使い方
import pickle
# シリアライゼーション
data = {'key': 'value'}
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
# デシリアライゼーション
with open('data.pkl', 'rb') as f:
loaded_data = pickle.load(f)
print(loaded_data) # Output: {'key': 'value'}
応用例
応用例1: クラスオブジェクトのシリアライゼーション
Pythonの`pickle`はクラスオブジェクトもシリアライズできます。
class MyClass:
def __init__(self, value):
self.value = value
# シリアライゼーション
obj = MyClass('Hello')
with open('obj.pkl', 'wb') as f:
pickle.dump(obj, f)
# デシリアライゼーション
with open('obj.pkl', 'rb') as f:
loaded_obj = pickle.load(f)
print(loaded_obj.value) # Output: Hello
応用例2: NumPy配列のシリアライゼーション
NumPy配列も`pickle`でシリアライズできますが、`numpy.save`メソッドが専用に用意されています。
import numpy as np
# シリアライゼーション
arr = np.array([1, 2, 3])
np.save('arr.npy', arr)
# デシリアライゼーション
loaded_arr = np.load('arr.npy')
print(loaded_arr) # Output: [1 2 3]
応用例3: シリアライゼーションでのセキュリティ対策
`pickle`は任意のコード実行を許す可能性があります。そのため、信頼できないデータには`pickle.load()`を使用しないようにしましょう。
import pickle
# 危険なデータ例
dangerous_data = b"\x80\x04\x95\x15\x00\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x05eval\x94\x93\x94."
try:
pickle.loads(dangerous_data)
except pickle.UnpicklingError:
print("危険なデータです。")
まとめ
Pythonにおけるバイナリデータとオブジェクトのシリアライゼーションには、多くの方法と応用例があります。しかし、セキュリティには十分注意が必要です。データの転送や保存に関わる場面で、この知識が役立つことを願います。
コメント