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

파이썬 객체 직렬화

<시간/>

직렬화는 객체가 (파일 또는 메모리 버퍼에) 저장/저장할 수 있는 형식으로 변환되는 프로세스이므로 나중에 역직렬화하고 직렬화된 형식에서 원래 콘텐츠/객체를 복구할 수 있습니다. 우리는 이 모든 작업을 수행하기 위해 python pickle 모듈을 사용할 것입니다.

절임이란 무엇입니까?

파이썬 피클 모듈은 파이썬 객체 구조를 직렬화 및 역직렬화하는 데 사용됩니다. 모든 종류의 파이썬 객체(목록, 사전 등)를 바이트 스트림(0과 1)으로 변환하는 프로세스를 산세 또는 직렬화 또는 병합 또는 마샬링이라고 합니다. (피클링을 통해 생성된) 바이트 스트림을 언피클링이라고 하는 프로세스를 통해 파이썬 객체로 다시 변환할 수 있습니다.

객체를 피클하려면 다음을 수행하면 됩니다. -

  • 피클 가져오기
  • dumps() 함수 호출
import pickle
class Vehicle:
   def __init__(self, number_of_doors, color):
      self.number_of_doors = number_of_doors
      self.color = color
class Car(Vehicle):
   def __init__(self, color):
      Vehicle.__init__(self, 5, color)
Maruti = Car('Red')
print(str.format('My Vehicle Maruti is {0} and has {1} doors', Maruti.color, Maruti.number_of_doors))
pickle_Maruti = pickle.dumps(Maruti)
print('Here is my pickled Vehicle: ')
print(pickle_Maruti)

출력

My Vehicle Maruti is Red and has 5 doors
Here is my pickled Vehicle:
b'\x80\x03c__main__\nCar\nq\x00)\x81q\x01}q\x02(X\x0f\x00\x00\x00number_of_doorsq\x03K\x05X\x05\x00\x00\x00colorq\x04X\x03\x00\x00\x00Redq\x05ub.'

위의 예에서 Car 클래스의 인스턴스를 만든 다음 이를 피클하여 자동차 인스턴스를 간단한 바이트 배열로 변환했습니다. 자동차 인스턴스가 피클된 후에는 바이너리 파일이나 db 필드에 쉽게 저장하고 나중에 복원하여 개체 계층에서 이 바이트 무리를 다시 변환할 수 있습니다.

참고:피클된 객체로 파일을 생성하려면 dumps() 메서드 대신 dump() 메서드를 사용해야 합니다.

언피클링

역(또는 산세) 연산으로 이진 스트림을 가져와서 개체 계층 구조로 변환합니다.

unpickling은 pickle 모듈의 load() 함수를 사용하여 수행되고 바이트 스트림에서 완전한 객체 계층 구조를 반환합니다.

아래는 부하입니다.

import pickle
class Vehicle:
   def __init__(self, number_of_doors, color):
      self.number_of_doors = number_of_doors
      self.color = color
class Car(Vehicle):
   def __init__(self, color):
      Vehicle.__init__(self, 5, color)
Maruti = Car('Red')
print(str.format('My Vehicle Maruti is {0} and has {1} doors', Maruti.color, Maruti.number_of_doors))
pickle_Maruti = pickle.dumps(Maruti)
#Now, let's unpickle our car Maruti creating another instance, another car ... unpickle_Maruti
Hyundai = pickle.loads(pickle_Maruti)
#Set another color of our new instance
Hyundai.color = 'Black'
print(str.format("Hyundai is {0} ", Hyundai.color))
print(str.format("Maruti is {0} ", Maruti.color))

위의 예에서 첫 번째 자동차 개체(Maruti)를 피클링한 다음 다른 변수(Hyundai)에 피클링을 해제하여 어떤 의미에서는 Maruti를 복제하여 Hyundai를 만든 것을 볼 수 있습니다.

출력

My Vehicle Maruti is Red and has 5 doors
Hyundai is Black
Maruti is Red

피클 대 JSON

JSON은 Javascript Object Notation의 약자로 데이터 교환을 위한 경량 형식이며 사람이 읽을 수 있습니다. 피클에 비해 JSON의 가장 큰 장점 중 하나는 표준화되고 언어 독립적이라는 것입니다. 피클보다 훨씬 안전하고 빠릅니다.

피클에 대한 또 다른 대안은 피클과 매우 유사하지만 C 언어로 작성되고 1000배 더 빠른 cPickle입니다. pickle 및 cPickle에 동일한 파일을 사용할 수 있습니다.

import json
mylist = [2, 4, 5, "ab", "cd", "ef"]
print("Here is my list: ", mylist)
json_string = json.dumps(mylist )
print("Here is my json encoded object: ", json_string)
print ("Here is JSON back to a data structure: ",json.loads(json_string))

출력

Here is my list: [2, 4, 5, 'ab', 'cd', 'ef']
Here is my json encoded object: [2, 4, 5, "ab", "cd", "ef"]
Here is JSON back to a data structure: [2, 4, 5, 'ab', 'cd', 'ef']

위의 코드에서 우리는 먼저 객체(내 목록)를 가져오고 "dumps" 메서드를 사용하여 문자열을 반환한 다음 JSON을 데이터 구조로 다시 로드하기 위해 문자열을 변환하고 변환하는 "loads" 메서드를 사용합니다. JSON 객체 데이터 구조.