Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 클래스를 직렬화하는 방법은 무엇일까?

객체 직렬화(Serialization)와 역직렬화(Deserialization)는 어느 정도 규모가 있는 파이썬 프로그램이라면 반드시 마주하게 되는 기본적인 작업입니다. 파일에 데이터를 저장하거나, 설정 파일을 읽어오거나, HTTP 요청에 응답을 반환하는 등의 작업에는 모두 객체를 직렬화하고 다시 복원하는 과정이 포함됩니다.

직렬화와 역직렬화는 파이썬 객체를 스트림 형태로 내보내고, 나중에 손상 없이 그대로 되돌려 받기 위해 다양한 방식·포맷·프로토콜을 활용합니다. 어떤 직렬화 방식을 선택하느냐에 따라 프로그램의 실행 속도와 보안 수준이 크게 달라질 수 있습니다.

pickle 모듈로 객체 직렬화하기

여기서는 파이썬 객체들로 구성된 딕셔너리를 직렬화해 보겠습니다. 클래스 역시 파이썬에서는 하나의 객체이므로 동일한 방식으로 직렬화할 수 있습니다. 이때 표준 라이브러리의 pickle 모듈과 그 메서드인 pickle.dumps(object)를 사용합니다.

foo = dict(int_list=[3, 4, 5], text='Hello World', number=9.99, boolean=False, none=None)
import cPickle as pickle

print pickle.dumps(foo)

print pickle.dumps(foo, protocol=pickle.HIGHEST_PROTOCOL)

dumps()는 객체를 바이트 스트림으로 변환하여 반환하며, 두 번째 인자인 protocolpickle.HIGHEST_PROTOCOL을 지정하면 해당 파이썬 버전에서 지원하는 가장 빠르고 효율적인 프로토콜로 직렬화할 수 있습니다.

참고: Python 3 환경이라면

cPickle은 Python 2 전용 모듈입니다. Python 3에서는 C로 구현된 고속 구현이 표준 pickle 모듈에 통합되었으므로, 아래와 같이 작성하는 것이 권장됩니다.

import pickle

foo = dict(int_list=[3, 4, 5], text='Hello World', number=9.99, boolean=False, none=None)

data = pickle.dumps(foo)  # 기본 프로토콜 사용
data = pickle.dumps(foo, protocol=pickle.HIGHEST_PROTOCOL)  # 최적 성능 프로토콜 사용

마무리

이처럼 pickle을 활용하면 딕셔너리뿐 아니라 클래스 인스턴스를 포함한 대부분의 파이썬 객체를 간단히 직렬화하고 복원할 수 있습니다. 다만 pickle은 파이썬 전용 포맷이며, 신뢰할 수 없는 출처의 데이터를 역직렬화하면 보안 위험이 있으므로 주의해야 합니다. 다른 언어와 데이터를 주고받아야 하는 상황이라면 JSON과 같은 범용 포맷을 사용하는 것이 더 안전한 선택입니다.