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