marshal — 파이썬 객체 내부 직렬화
marshal — 파이썬 객체 내부 직렬화
marshal 모듈은 파이썬 값을 바이너리 형식으로 읽고 쓸 수 있는 함수를 포함해요. 형식은 파이썬 고유이지만 기계 아키텍처 문제와는 독립적이에요(예: PC에서 파일에 파이썬 값을 쓰고, 파일을 Mac으로 옮긴 다음 그곳에서 다시 읽을 수 있음). 형식의 세부 사항은 의도적으로 문서화되지 않았으며, 파이썬 버전 간에 변경될 수 있어요(드물지만).
이것은 일반적인 “영속성(persistence)” 모듈이 아니에요. 일반적인 영속성과 RPC 호출을 통한 파이썬 객체 전송에는 pickle과 shelve 모듈을 참고해요. marshal 모듈은 주로 .pyc 파일의 파이썬 모듈에 대한 “의사 컴파일된(pseudo-compiled)” 코드를 읽고 쓰는 것을 지원하기 위해 존재해요. 따라서 파이썬 유지 관리자는 필요할 경우 하위 호환되지 않는 방식으로 marshal 형식을 수정할 권리를 보유해요.
코드 객체의 형식은 형식 버전이 같더라도 파이썬 버전 간에 호환되지 않아요. 잘못된 파이썬 버전에서 코드 객체를 역직렬화하면 정의되지 않은 동작이 발생해요. 파이썬 객체를 직렬화·역직렬화한다면 pickle 모듈을 대신 사용해요. 성능은 비슷하고, 버전 독립성이 보장되며, pickle은 marshal보다 훨씬 더 넓은 범위의 객체를 지원해요.
경고: marshal 모듈은 오류가 있거나 악의적으로 구성된 데이터에 대해 안전하도록 설계되지 않았어요. 신뢰할 수 없거나 인증되지 않은 소스에서 받은 데이터는 절대 unmarshal하지 마세요.
파일을 읽고 쓰는 함수와 bytes 유사 객체에서 동작하는 함수가 있어요. 모든 파이썬 객체 타입이 지원되는 것은 아니며, 일반적으로 값이 특정 파이썬 호출에 독립적인 객체만 이 모듈로 읽고 쓸 수 있어요.
본문
지원되는 타입은 다음과 같아요:
- 숫자 타입:
int,bool,float,complex. - 문자열(
str)과bytes.bytearray같은 bytes 유사 객체는bytes로 marshall돼요. - 컨테이너:
tuple,list,set,frozenset, 그리고(버전 5부터)slice. - 단일 값(singleton)
None,Ellipsis,StopIteration. code객체(allow_code가 참일 때).
함수
marshal.dump(value, file, version=version, /, *, allow_code=True) — 열린 파일에 값을 써요. 값은 지원되는 타입이어야 하고, 파일은 쓰기 가능한 바이너리 파일이어야 해요. 값이(또는 포함된 객체가) 지원되지 않는 타입을 가지면 ValueError 예외가 발생하지만 — 쓰레기 데이터도 파일에 기록돼요. 객체는 load()로 제대로 다시 읽히지 않아요. 코드 객체는 allow_code가 참일 때만 지원돼요.
marshal.load(file, /, *, allow_code=True) — 열린 파일에서 하나의 값을 읽어 반환해요. 유효한 값을 읽지 못하면(예: 데이터가 다른 파이썬 버전의 호환되지 않는 marshal 형식이라서) EOFError, ValueError 또는 TypeError를 발생시켜요. 코드 객체는 allow_code가 참일 때만 지원돼요. 지원되지 않는 타입을 포함하는 객체가 dump()로 marshall되었다면 load()는 marshall할 수 없는 타입에 대해 None을 대체해요.
marshal.dumps(value, version=version, /, *, allow_code=True) — dump(value, file)이 파일에 쓸 bytes 객체를 반환해요. 값은 지원되는 타입이어야 해요. 값이 지원되지 않는 타입을 가지면 ValueError 예외를 발생시켜요.
marshal.loads(bytes, /, *, allow_code=True) — bytes 유사 객체를 값으로 변환해요. 유효한 값을 찾지 못하면 EOFError, ValueError 또는 TypeError를 발생시켜요. 입력의 추가 바이트는 무시돼요.
상수
marshal.version — 모듈이 사용하는 형식을 나타내요. 버전 0은 역사적인 첫 번째 버전이며, 이후 버전은 새 기능을 추가해요. 일반적으로 새 버전이 도입되면 기본값이 돼요.
| 버전 | 사용 가능 | 새 기능 |
|---|---|---|
| 1 | Python 2.4 | 내부된(interned) 문자열 공유 |
| 2 | Python 2.5 | float의 바이너리 표현 |
| 3 | Python 3.4 | 객체 인스턴싱과 재귀 지원 |
| 4 | Python 3.4 | 짧은 문자열의 효율적 표현 |
| 5 | Python 3.14 | slice 객체 지원 |
참고
이 모듈의 이름은 Modula-3 등의 설계자들이 사용하는 용어에서 유래했어요. 이들은 데이터를 자체 포함된 형태로 보내는 것을 “marshalling”이라고 불러요. 엄밀히 말하면 “to marshal”은 내부 형태에서 외부 형태로 데이터를 변환하는 것을 의미하고, “unmarshalling”은 그 반대 과정을 의미해요.