Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

내부 Python 객체 직렬화(마샬링)

<시간/>

파이썬 표준 라이브러리의 마샬 모듈은 객체 직렬화 기능(피클 모듈과 유사)을 제공하지만 범용 데이터 지속성이나 소켓 등을 통한 파이썬 객체 전송에는 실제로 유용하지 않습니다. 이 모듈은 대부분 파이썬 자체에서 읽기/ 컴파일된 버전의 Python 모듈(.pyc 파일)에 대한 쓰기 작업. 마샬 모듈에서 사용하는 데이터 형식은 Python 버전 간에 호환되지 않습니다(하위 버전도 포함하지 않음). 이것이 한 버전의 컴파일된 Python 스크립트(.pyc 파일)가 다른 버전에서 실행되지 않는 이유입니다. 따라서 마샬 모듈은 파이썬의 내부 객체 직렬화에 사용됩니다.

pickle 모듈과 마찬가지로 마샬 모듈은 파일에서 /로 마샬링된 객체를 읽고 쓰기 위한 load() 및 dump() 함수도 정의했습니다. 또한, load() 및 dumps() 함수는 마샬링된 객체의 문자열 표현을 처리합니다.

덤프() - 파이썬 객체를 마샬링하는 객체와 같은 바이트를 반환합니다. 마샬링에는 표준 데이터 유형의 개체만 지원됩니다. 지원되지 않는 유형은 ValueError 예외를 발생시킵니다.

로드() − 이 함수는 byte like 객체를 해당 Python 객체로 변환합니다. 변환 결과 유효한 Python 개체가 생성되지 않으면 ValueError 또는 TypeError가 발생할 수 있습니다.

다음 코드는 dumps()를 사용하여 마샬링된 Python 사전 객체를 보여줍니다. 바이트 표현은 load() 함수에 의해 사전으로 다시 변환됩니다.

import marshal
person = {"name":"xyz", "age":22, "marks":[45,56,78]}
data = marshal.dumps(person)
obj = marshal.loads(data)
print (obj)

덤프() − 이 함수는 지원되는 Python 객체의 바이트 표현을 파일에 씁니다. 파일 자체는 쓰기 권한이 있는 바이너리 파일입니다.

로드() − 이 함수는 바이너리 파일에서 바이트 데이터를 읽어서 파이썬 객체로 변환합니다.

위에서 언급했듯이 마샬 모듈은 .pyc 파일을 처리하는 데 사용됩니다. 다음 예제는 미리 컴파일된 Python 모듈을 저장하는 데 사용되는 Python의 코드 개체를 처리하기 위해 dump() 및 load() 함수를 사용하는 방법을 보여줍니다.

코드는 내장된 compile() 함수를 사용하여 Python 명령어를 포함하는 소스 문자열에서 코드 개체를 빌드합니다.

compile(source, file, mode)

파일 매개변수는 코드를 읽은 파일이어야 합니다. 파일에서 읽지 않은 경우 임의의 문자열을 전달합니다.

소스에 일련의 명령문이 포함된 경우 모드 매개변수는 'exec', 단일 표현식이 있는 경우 'eval', 단일 대화식 명령문이 포함된 경우 'single'입니다.

그런 다음 컴파일 코드 개체는 dump() 함수를 사용하여 .pyc 파일에 저장됩니다.

import marshal
script = """
a = 10
b = 20
print ('addition = ',a+b)
"""
code = compile(script, "script", "exec")
f = open("a.pyc","wb")
marshal.dump(code, f)
f.close()

.pyc 파일에서 객체를 역직렬화하려면 load() 함수를 사용합니다. 코드 객체를 반환하므로 다른 내장 함수인 exec()를 사용하여 실행할 수 있습니다.

import marshal
f = open("a.pyc","rb")
data = marshal.load(f)
exec (data)

출력은 소스 문자열에 포함된 코드 블록의 결과입니다.

addition = 30