Subclassing¶
You can subclass Serializer
or Deserializer
to change how we detect and serialize/deserialize Dataclasses
or Marshmallow Schemas
.
Subclassing Marshmallow¶
Your subclass will need to implement these methods on Serializer:
is_marshmallow_model
serialize_marshmallow_model
serialize_marshmallow_model_to_dict
And these methods on Deserializer:
is_marshmallow_model
deserialize_marshmallow_model
Example:
from typing import T, Type, Union
from flask import Blueprint, Flask
from flask_hintful import Deserializer, FlaskHintful, Serializer
class MySerializer(Serializer):
def is_marshmallow_model(data: T) -> bool:
'''Returns True if Data is a Marshmallow object'''
pass
def serialize_marshmallow_model(data: T) -> str:
'''Serializes Marshmallow object data into a JSON str'''
pass
def serialize_marshmallow_model_to_dict(data: T) -> dict:
'''Serializes Marshmallow object data into a dict'''
pass
class MyDeserializer(Deserializer):
@staticmethod
def is_marshmallow_model(type_: Type) -> bool:
'''Returns True if type_ is a marshmallow'''
pass
@staticmethod
def deserialize_marshmallow_model(data: Union[str, dict], type_: Type) -> T:
'''Returns deserialized data into instance of type_'''
pass
app = Flask('My API')
api = FlaskHintful(app,
serializer=MySerializer(),
deserializer=MyDeserializer())
Subclassing Dataclass¶
Your subclass will need to implement these methods on Serializer:
is_dataclass
serialize_dataclass
serialize_dataclass_to_dict
And these methods on Deserializer:
is_dataclass
deserialize_dataclass
Example:
from typing import T, Type, Union
from flask import Blueprint, Flask
from flask_hintful import Deserializer, FlaskHintful, Serializer
class MySerializer(Serializer):
def is_dataclass(data: T) -> bool:
'''Returns True if Data is a Dataclass'''
pass
def serialize_dataclass(data: T) -> str:
'''Serializes Dataclass data into a JSON str'''
pass
def serialize_dataclass_to_dict(data: T) -> dict:
'''Serializes Dataclass data into a dict'''
pass
class MyDeserializer(Deserializer):
@staticmethod
def is_dataclass(type_: Type) -> bool:
'''Returns True if type_ is a Dataclass'''
pass
@staticmethod
def deserialize_dataclass(data: Union[str, dict], type_: Type) -> T:
'''Returns deserialized data into instance of type_'''
pass
app = Flask('My API')
api = FlaskHintful(app,
serializer=MySerializer(),
deserializer=MyDeserializer())