직렬화는 객체를 바이트 스트림(또는 문자열)으로 변환하는 과정으로, 저장하거나 네트워크를 통해 전송하기 위한 것이고, 역직렬화는 그 반대의 작업입니다.
역사적으로 파이썬에서는 다양한 애플리케이션과 언어 간에 복잡한 데이터 구조를 표준화하여 교환하는 것이 주요 문제였습니다. 이를 위해 표준 라이브러리에는 다양한 모듈이 등장하게 되었으며, 먼저 pickle이 모든 파이썬 객체의 직렬화를 위해 등장했고, 이후 json이 외부 시스템과의 범용적인 교환을 위해 등장했습니다.
문제점: pickle은 파이썬 전용 데이터를 저장하며, 안전하지 않고(로드 시 임의의 코드를 실행할 수 있음), 다른 언어와 호환되지 않습니다. json은 기본 데이터 타입만 지원(딕셔너리, 리스트, 문자열, 정수, 실수, 불린 및 None)하지만 더 안전하고 다양한 기술 간의 교환에 널리 사용됩니다.
해결책: pickle은 신뢰할 수 있는 데이터에 대해서만 파이썬 시스템 간에 사용하고, json은 외부 서비스 간의 교환, 웹 개발 및 사람 읽기 가능한 데이터 구조의 전송을 위해 사용합니다.
코드 예시:
import pickle import json data = {'a': [1, 2, 3], 'b': True} # pickle로 직렬화 pickled = pickle.dumps(data) # 바이트 unpickled = pickle.loads(pickled) print(unpickled) # json으로 직렬화 jsoned = json.dumps(data) # 문자열 unjsoned = json.loads(jsoned) print(unjsoned)
주요 특징:
pickle을 통해 외부 시스템에 HTTP API 응답을 전달할 수 있나요?
아니요! pickle은 언어 간 데이터 교환의 표준이 아니며 매우 안전하지 않습니다: pickle에서 로드할 때 외부 코드를 실행할 수 있습니다. json이 외부 상호 작용에는 훨씬 더 적합합니다.
json으로 함수, 클래스 또는 람다 함수를 직렬화할 수 있나요?
아니요. json은 기본 데이터 타입에만 작동하며; 함수와 클래스는 표준 json 및 대부분의 파서로 직렬화되지 않습니다.
pickle이 순환 참조가 있는 객체를 직렬화할 수 있나요?
네, pickle은 대부분의 순환 참조를 자동으로 처리하며, 재귀 구조까지도 가능합니다. json의 경우 일반적으로 치명적인 오류가 발생합니다.
부정적인 사례: 클라이언트 애플리케이션에 pickle 객체를 전달하여 데이터를 교환하는 것.
장점: 간단한 구현, 모든 파이썬 타입 유지.
단점: 치명적으로 위험하며 다른 언어와 상호 작용할 수 없음.
긍정적인 사례: json을 통해 데이터를 전송하고, 비표준 타입을 인코더를 사용해 변환하는 것.
장점: 안전성, 호환성, 유연성.
단점: 지원되는 타입에 대한 제한, 때때로 맞춤 인코더/디코더가 필요함.