직렬화와 역직렬화
파이썬의 객체를 일련의 바이트들로 변환한 후 나중에 다시 파이썬 객체로 복원하게 할 수 있는데, 이렇게 파이썬 객체를 일련의 바이트들로 변환하는 것을 직렬화(Serialization)라 하고, 다시 바이트들을 파이썬 객체로 메모리 상에 복원하는 것을 역직렬화(Deserialization)이라 한다. 직렬화된 바이트들은 외부 장치에 저장하거나 다른 시스템으로 전송할 수 있으며, 파이썬을 사용하는 다른 시스템은 (OS와 같은 플랫폼 환경에 상관없이) 다시 이를 파이썬 객체로 역직렬화할 수 있다.
파이썬에서 직렬화(Serialization)와 역직렬화(Deserialization)를 사용하기 위해서는 pickle 모듈 혹은 cPickle 모듈을 사용한다.
(참고: pickle 모듈은 파이썬으로 작성되었으며 cPickle 모듈은 C로 작성되어 있는데, cPickle 모듈이 더 빠르기 때문에 성능이 중요한 경우 cPickle 을 사용하는 것이 좋다. 하지만, cPickle은 서브클래스를 만들 수 없기 때문에, 서브클래스를 작성할 필요가 있으면 pickle 을 사용해야 한다. cPickle은 Python 2 에선 "import cPickle"을 사용하여 import 하고, Python 3에서는 "import _pickle"을 사용한다.)
아래 예제는 사각형 클래스의 객체를 이진 파일에 직렬화한 후 이를 다시 읽어들여 사각형 객체로 복원하는 역직렬화 과정을 예시한 것이다. 직렬화하면 바이너리 형태이므로 이진 파일 모드로 파일을 열어야 한다. 아래 예제에서 복원된 객체 r 은 width, height 등의 attribute를 이전에 저장한 값 그대로 가지고 있다.
import pickle
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
self.area = width * height
rect = Rectangle(10, 20)
# 사각형 rect 객체를 직렬화 (Serialization)
with open('rect.data', 'wb') as f:
pickle.dump(rect, f)
# 역직렬화 (Deserialization)
with open('rect.data', 'rb') as f:
r = pickle.load(f)
print("%d x %d" % (r.width, r.height))