객체 직렬화라는 용어는 객체의 상태를 바이트 스트림으로 변환하는 프로세스를 나타냅니다. 이 바이트 스트림이 생성되면 파일에 추가로 저장하거나 소켓 등을 통해 전송할 수 있습니다. 반면에 바이트 스트림에서 객체를 재구성하는 것을 역직렬화라고 합니다.
직렬화 및 역직렬화에 대한 Python의 용어는 각각 피클링 및 피클링 해제입니다. Python의 표준 라이브러리에서 사용할 수 있는 pickle 모듈은 직렬화(dump() 및 dumps()) 및 역직렬화(load() 및 load())를 위한 함수를 제공합니다.
pickle 모듈은 매우 Python 전용 데이터 형식을 사용합니다. 따라서 Python으로 작성되지 않은 프로그램은 인코딩된(피클된) 데이터를 적절하게 역직렬화하지 못할 수 있습니다. 또한 인증되지 않은 소스에서 데이터를 언피클하는 것은 안전한 것으로 간주되지 않습니다.
피클 프로토콜
프로토콜은 파이썬 객체를 바이너리 데이터로 생성하고 분해하는 데 사용되는 규칙입니다. 현재 pickle 모듈은 아래와 같이 5가지 다른 프로토콜을 정의합니다 -
프로토콜 버전 0 | 원래 "사람이 읽을 수 있는" 프로토콜은 이전 버전과 역호환됩니다. |
프로토콜 버전 1 | 이전 바이너리 형식은 이전 버전의 Python과도 호환됩니다. |
프로토콜 버전 2 | Python 2.3에 도입되어 새로운 스타일의 클래스를 효율적으로 피클링합니다. |
프로토콜 버전 3 | 파이썬 3.0에 추가되었습니다. 다른 Python 3 버전과의 호환성이 필요할 때 권장됩니다. |
프로토콜 버전 4 | 는 Python 3.4에 추가되었습니다. 매우 큰 개체에 대한 지원을 추가합니다. |
Python 설치의 최고 및 기본 프로토콜 버전을 확인하려면 pickle 모듈에 정의된 다음 상수를 사용하십시오.
>>> import pickle >>> pickle.HIGHEST_PROTOCOL 4 >>> pickle.DEFAULT_PROTOCOL 3
앞서 언급한 것처럼 pickle 모듈의 dump() 및 load() 함수는 Python 데이터의 pickling 및 unpickling을 수행합니다. dump() 함수는 피클된 객체를 파일에 쓰고 load() 함수는 파일에서 Python 객체로 데이터를 언피클링합니다.
다음 프로그램은 사전 개체를 바이너리 파일로 피클합니다.
import pickle f = open("data.txt","wb") dct = {"name":"Ravi", "age":23, "Gender":"M","marks":75} pickle.dump(dct,f) f.close()
위의 코드를 실행하면 사전 객체의 바이트 표현이 data.txt 파일에 저장됩니다.
바이너리 파일에서 사전으로 데이터를 역직렬화하거나 역직렬화하려면 다음 프로그램을 실행하십시오.
import pickle f = open("data.txt","rb") d = pickle.load(f) print (d) f.close()
Python 콘솔은 파일에서 읽은 사전 객체를 보여줍니다.
{'age': 23, 'Gender': 'M', 'name': 'Ravi', 'marks': 75}
pickle 모듈은 또한 pickle 데이터의 문자열 표현을 반환하는 dumps() 함수로 구성됩니다.
>>> from pickle import dump >>> dct = {"name":"Ravi", "age":23, "Gender":"M","marks":75} >>> dctstring = dumps(dct) >>> dctstring b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00Raviq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x06\x00\x00\x00Genderq\x04X\x01\x00\x00\x00Mq\x05X\x05\x00\x00\x00marksq\x06KKu.'
load() 함수를 사용하여 문자열을 unpickle하고 원래 사전 객체를 얻습니다.
>>> from pickle import load >>> dct = loads(dctstring) >>> dct {'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}
pickle 모듈은 Pickler 및 Unpickler 클래스도 정의합니다. Pickler 클래스는 파일에 피클 데이터를 씁니다. Unpickler 클래스는 파일에서 바이너리 데이터를 읽고 Python 객체를 생성합니다.
Python 객체의 pickled 데이터를 작성하려면
from pickle import pickler f = open("data.txt","wb") dct = {'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75} Pickler(f).dump(dct) f.close()
바이너리 파일을 언피클링하여 데이터를 다시 읽으려면
from pickle import Unpickler f = open("data.txt","rb") dct = Unpickler(f).load() print (dct) f.close()
모든 Python 표준 데이터 유형의 개체는 피클 가능합니다. 또한 사용자 정의 클래스의 개체도 피클 및 피클 해제할 수 있습니다.
from pickle import * class person: def __init__(self): self.name = "XYZ" self.age = 22 def show(self): print ("name:", self.name, "age:", self.age) p1 = person() f = open("data.txt","wb") dump(p1,f) f.close() print ("unpickled") f = open("data.txt","rb") p1 = load(f) p1.show()
Python 라이브러리에는 Python 개체의 내부 직렬화에 사용되는 마샬 모듈도 있습니다.