오늘 공부한 파이썬 직렬화에 관하여 간단히 정리해보려고 합니다
서론
데이터를 어디론가 전송할 때 한 번에 한 바이트씩밖에 지나가지 못하는 좁은 통로로 이루어져 있기 때문에 이 통로를 지나가기 위해서는 한 줄의 바이트로 만들어야 합니다 (직렬화, 인코딩)
이때 연결통로의 역할은 스트림이라고 하는데 한 줄의 바이트로 만든 데이터들을 스트림을 통해서 전달하는 것입니다
이 데이터를 컴퓨터에 저장하기 위해서는 직렬화가 꼭 필요합니다
다시 간단하게 정리하자면 직렬화는 앞서 설명한 연결통로인 스트림 전송을 위해서 데이터들을 한 줄의 바이트로 변형하는 작업이라고 생각하면 됩니다
파이썬은 객체지향 언어이며 모든 것이 객체입니다
어떤 속성 값이나 행동을 가지고 있는 데이터들을 객체라고 부르는데
파이썬에서 이 객체를 직렬화하는데 도움을 주는 모듈 중에는 pickle이라는 모듈이 있습니다
Pickle을 통한 직렬화 예제
1
2
3
4
5
6
7
8
9
10
11
|
import pickle #pickle 라이브러리를 불러옴
#pickle변수 사용방법
#pickle.dumps(객체)
print(pickle.dumps([1,2,3,4]))
print(pickle.dumps('hello world'))
출력 결과
b'\x80\x04\x95\r\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03K\x04e.'
b'\x80\x04\x95\x0f\x00\x00\x00\x00\x00\x00\x00\x8c\x0bhello world\x94.'
|
cs |
Pickle.dumps() 함수를 통해서 직렬화할 객체를 넣어주고 실행하게 되면 출력 결과와 같이 문자가 출력됩니다
여기서 문자 앞에 b는 바이트 배열을 의미합니다
위 예제에서는 1,2,3,4의 값이 들어있는 리스트와 hello world라는 문자열을 각각 바이트 배열로 객체화시켰습니다
정리
#pickle.dump(객체,파일)
#with open(test.txt','wb') as f:
pickle.dump([a,b,c],f)
#pickle.dumps(객체)
pickle.dumps([1,2,3])
그렇다면 이렇게 바이트 형태로 변환된 객체를 다시 원래의 객체로 변환 시기키 위해선 어떻게 해야 할까요?
다음 예시를 한번 보시죠
pickle을 통한 역직렬화 예제
1
2
3
4
5
6
7
8
9
10
|
import pickle
#pickle.loads(바이트배열)
print(pickle.loads(b'\x80\x04\x95\r\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03K\x04e.'))
print(pickle.loads(b'\x80\x04\x95\x0f\x00\x00\x00\x00\x00\x00\x00\x8c\x0bhello world\x94.'))
출력 결과
[1, 2, 3, 4]
hello world
|
cs |
pickle.loads를 통하여 아까 바이트 배열로 변환된 객체를 넣어주면 출력 결과와 같이 원래 형태의 객체로 출력되는 걸 확인할 수 있습니다
정리
pickle.load(파일 객체)
pickle.loads(바이트 객체)
JSON을 통한 직렬화 예제
pickle과 비슷하게 파이썬에서 직렬화 하기 위하여 사용하는 라이브러리 중에서 Json이라는 것도 있는데 다른 언어와도 범용적으로 쓰이고 pickle과 다르게 바이트 배열처럼 알아보기 어려운 결과가 아닌 사람이 읽고 쓰기가 쉬운 가독성 측면에서의 장점이 있습니다
다만 json은 pickle에 비하여 직렬화 할 수 있는 객체가 한정되어 있다는 단점이 존재합니다
1
2
3
4
5
6
|
import json
print(json.dumps({'man':'woman',"boy":"girl"}))
출력 결과
'{"man": "woman", "boy": "girl"}'
|
cs |
딕셔너리를 직렬화하였더니 출력결과에서 보면 알수 있듯이 pickle을 사용했을때 처럼 문자열로 변경되었습니다
다만 pickle을 사용하였을 때와 달리 원본과 동일하며 pickle과 다르게 사람이 더 읽기 쉬운 형태를 가졌습니다
JSON을 통한 역직렬화 예제
1
2
3
4
5
6
|
import json
print(json.loads('{"man": "woman", "boy": "girl"}'))
출력 결과
{'man': 'woman', 'boy': 'girl'}
|
cs |
json을 사용하여 직렬화한 문자열을 다시 역직렬화 하였을 때 정상적으로 파이썬 객체가 출력됩니다