Implementing pickle methods (#535)
Continuing work from #484 by @kevinaud to fix #419 * Implementing pickle methods * Implement __copy__, __reduce__, and fix __setstate__ * Moved pickling tests into their own file * Add test for caching
This commit is contained in:
@@ -874,6 +874,14 @@ class Message(ABC):
|
||||
kwargs[name] = deepcopy(value)
|
||||
return self.__class__(**kwargs) # type: ignore
|
||||
|
||||
def __copy__(self: T, _: Any = {}) -> T:
|
||||
kwargs = {}
|
||||
for name in self._betterproto.sorted_field_names:
|
||||
value = self.__raw_get(name)
|
||||
if value is not PLACEHOLDER:
|
||||
kwargs[name] = value
|
||||
return self.__class__(**kwargs) # type: ignore
|
||||
|
||||
@property
|
||||
def _betterproto(self) -> ProtoClassMetadata:
|
||||
"""
|
||||
@@ -1113,6 +1121,15 @@ class Message(ABC):
|
||||
"""
|
||||
return bytes(self)
|
||||
|
||||
def __getstate__(self) -> bytes:
|
||||
return bytes(self)
|
||||
|
||||
def __setstate__(self: T, pickled_bytes: bytes) -> T:
|
||||
return self.parse(pickled_bytes)
|
||||
|
||||
def __reduce__(self) -> Tuple[Any, ...]:
|
||||
return (self.__class__.FromString, (bytes(self),))
|
||||
|
||||
@classmethod
|
||||
def _type_hint(cls, field_name: str) -> Type:
|
||||
return cls._type_hints()[field_name]
|
||||
|
Reference in New Issue
Block a user