직렬화/역직렬화
직렬화 : 어떤 데이터를 다른 곳에서 사용할 수 있게 다른 포맷의 데이터로 바꾸는 것
역직렬화 : 다른 포맷의 데이터로 바뀐 데이터를 원래 포맷으로 복구하는 것
marshmallow 클래스
dump_only : 역직렬화 중에 스킵하는 필드(읽기 전용 필드)
load_only : 직렬화 중에 스킵하는 필드(쓰기 전용 필드)
many : 객체가 list로 직렬화되기 위해서 객체가 collection인 경우 True로 설정을 해야 한다.
marshmallow 사용해보기 - 직렬화
serialization.py를 하나 만들고 pip install -U marshmallow를 터미널에 입력하여 설치해 준다.
만든 serialization.py에 아래 코드를 입력해 준다.
개 클래스를 정의하여 이름, 나이, 크기, 무게, 출생지의 변수를 가지게 하였고, 이 클래스를 이용하여 포메라니안 객체를 하나 생성하여 출력해 주었다. 결과를 아래와 같다.
생성한 객체 중에서 출생지를 제외한 나머지 변수를 보내주는 코드를 작성할 것이다. 코드는 아래와 같다.
실행 결과를 보면 출생지를 제외한 이름, 나이, 사이즈, 무게가 출력되는 것을 확인할 수 있다.
딕셔너리에서 값을 얻어온 후 다 시 딕셔너리 값으로 만들어 넘기면 된다. 딕셔너리는 파이썬 내장 모듈인 json을 이용하여 json으로 바꿀 수 있다. 이제 객체를 하나 더 생성해서 보내보자. 코드는 아래와 같다.
실행을 해보면 아래와 같은 결과가 나온다.
잘 나오는 것을 확인할 수 있다. 그런데 지금은 객체가 두 개지만 만약 객체가 늘어나면 코드가 많이 늘어나게 된다. 그래서 이를 방지하기 위해서 사용하는 것이 Marshmallow 파이썬 라이브러리이다.
marshmallow는 스키마 크래스를 상속받아서 StingraySchema 클래스를 정의할 수 있다. 코드를 아래와 같이 수정해 준다.
class Stingray:
def __init__(self, name, age, size, weight, place_of_birth):
self.name = name #이름
self.age = age #나이
self.size = size #크기/높이
self.weight = weight #무게
self.place_of_birth = place_of_birth #출생지
포메라니안_포포 = Stingray(
"포포",
"3",
"14cm",
"2.3kg",
"Germany",
)
도베르만_도비 = Stingray (
"도비",
"8",
"70cm",
"40kg",
"Germany",
)
from dataclasses import field
from marshmallow import Schema, fields
#개 스키마 클래스 정의
class StingraySchema(Schema):
name = fields.String()
age = fields.String()
size = fields.String()
weight = fields.String()
개정보_변환기 = StingraySchema()
포포_정보 = 개정보_변환기.dump(포메라니안_포포)
도비_정보 = 개정보_변환기.dump(도베르만_도비)
print(포포_정보)
print(도비_정보)
StingraySchema 클래스를 정의하고 앞에서 만들었던 개 객체의 정보를 개정보_변환기.dump(포메라니안_포포) 코드를 이용하여 내가 원하는 정보면 변환이 되도록 코드를 쓴 것이다. 그래서 결과를 실행해 보면 아래와 같은 결과가 나오게 된다.
지금까지 한 작업은 클래스 인스턴스를 딕셔너리 형태로 바꾼 것이었는데 아래 코드를 추가하여 딕셔너리를 json으로 바꿀 수 도 있다.
marshmallow 사용해 보기 - 역직렬화
이번에는 역직렬화를 해 볼 차례이다. 우선 serialization에서 json 부분을 주석 처리하고 deserialization.py를 하나 만들어
아래 코드를 추가해 준다.
from marshmallow import Schema, fields
from serialization import Stingray
import json
'''
어떤 데이터가 json 으로 들어왔고,
json.dumps(어떤 데이터) 를 통해서 <class dict> 가 되었다고 가정
'''
JSON_개_데이터 = {
"name" : "common_stingray",
"age" : "3",
"size" : "14cm",
"weight" : "2.3kg",
"place_of_birth" : "Germany"
}
#Schema 정의
class StingraySchema(Schema):
name = fields.String()
age = fields.String()
size = fields.String()
weight = fields.String()
place_of_birth = fields.String()
개정보_변환기 = StingraySchema()
data = 개정보_변환기.load(JSON_개_데이터)
Stingray_객체 = Stingray(**data)
print(Stingray_객체)
우선 들어온 json 데이터를 파이썬의 dict로 바꾸었다고 가정을 한 상태이다. 그래서 해당 데이터를 serialization.py에서 정의했던 Stingray 클래스의 객체로 바꿀 수 있게 되는 것이고 그 과정이 위 코드이다.
'Flask-Study' 카테고리의 다른 글
오류 및 내용 정리 (0) | 2022.10.06 |
---|---|
Ep10 : CORS / CSR / SSR 알아보기 (0) | 2022.09.19 |
플러거블 뷰(Pluggable View) (0) | 2022.08.31 |
Ep07 : Flask로 첫 번째 HTTP API 구축하기 (0) | 2022.08.21 |
Ep06 : 블로그 웹 애플리케이션 개발(3) - 댓글 CRUD, 게시물 삭제 처리, 간단한 contact form 구현하기 (0) | 2022.08.13 |