@@ -26,19 +26,10 @@ class TempPydanticModel(BaseModel):
2626class MessageSerializer :
2727 """Handles message serialization and deserialization."""
2828
29- @staticmethod
30- def _convert_to_json_safe (obj : Any ) -> Any :
31- """Convert objects to JSON-safe format."""
32- if isinstance (obj , BaseModel ):
33- return obj .model_dump_json ()
34- elif is_dataclass (obj ) and isinstance (obj , _Message ):
35- return TempPydanticModel .model_validate (dataclass_to_dict (obj )).model_dump_json ()
36- else :
37- raise SerializationError (f"Object { obj } must be a Pydantic model or dataclass Message" )
38-
3929 @staticmethod
4030 def serialize (message : Any , use_pickle : bool = False , is_generator :bool = False ) -> Any :
4131 """Serializes a message to IRIS format."""
32+ message = remove_iris_id (message )
4233 if use_pickle :
4334 return MessageSerializer ._serialize_pickle (message , is_generator )
4435 return MessageSerializer ._serialize_json (message , is_generator )
@@ -58,12 +49,34 @@ def _serialize_json(message: Any, is_generator: bool = False) -> Any:
5849 else :
5950 msg .json = json_string
6051 return msg
52+
53+ @staticmethod
54+ def _serialize_pickle (message : Any , is_generator : bool = False ) -> Any :
55+ """Serializes a message to IRIS format using pickle."""
56+ message = remove_iris_id (message )
57+ pickle_string = codecs .encode (pickle .dumps (message ), "base64" ).decode ()
58+ if is_generator :
59+ msg = _iris .get_iris ().cls ('IOP.Generator.Message.StartPickle' )._New ()
60+ else :
61+ msg = _iris .get_iris ().cls ('IOP.PickleMessage' )._New ()
62+ msg .classname = f"{ message .__class__ .__module__ } .{ message .__class__ .__name__ } "
63+ msg .jstr = _Utils .string_to_stream (pickle_string )
64+ return msg
6165
6266 @staticmethod
6367 def deserialize (serial : Any , use_pickle : bool = False ) -> Any :
6468 if use_pickle :
65- return MessageSerializer ._deserialize_pickle (serial )
66- return MessageSerializer ._deserialize_json (serial )
69+ msg = MessageSerializer ._deserialize_pickle (serial )
70+ else :
71+ msg = MessageSerializer ._deserialize_json (serial )
72+
73+ try :
74+ iris_id = serial ._Id ()
75+ msg ._iris_id = iris_id if iris_id else None
76+ except Exception as e :
77+ pass
78+
79+ return msg
6780
6881 @staticmethod
6982 def _deserialize_json (serial : Any ) -> Any :
@@ -90,17 +103,6 @@ def _deserialize_json(serial: Any) -> Any:
90103 except Exception as e :
91104 raise SerializationError (f"Failed to deserialize JSON: { str (e )} " )
92105
93- @staticmethod
94- def _serialize_pickle (message : Any , is_generator : bool = False ) -> Any :
95- pickle_string = codecs .encode (pickle .dumps (message ), "base64" ).decode ()
96- if is_generator :
97- msg = _iris .get_iris ().cls ('IOP.Generator.Message.StartPickle' )._New ()
98- else :
99- msg = _iris .get_iris ().cls ('IOP.PickleMessage' )._New ()
100- msg .classname = f"{ message .__class__ .__module__ } .{ message .__class__ .__name__ } "
101- msg .jstr = _Utils .string_to_stream (pickle_string )
102- return msg
103-
104106 @staticmethod
105107 def _deserialize_pickle (serial : Any ) -> Any :
106108 string = _Utils .stream_to_string (serial .jstr )
@@ -112,6 +114,24 @@ def _parse_classname(classname: str) -> tuple[str, str]:
112114 if j <= 0 :
113115 raise SerializationError (f"Classname must include a module: { classname } " )
114116 return classname [:j ], classname [j + 1 :]
117+
118+ @staticmethod
119+ def _convert_to_json_safe (obj : Any ) -> Any :
120+ """Convert objects to JSON-safe format."""
121+ if isinstance (obj , BaseModel ):
122+ return obj .model_dump_json ()
123+ elif is_dataclass (obj ) and isinstance (obj , _Message ):
124+ return TempPydanticModel .model_validate (dataclass_to_dict (obj )).model_dump_json ()
125+ else :
126+ raise SerializationError (f"Object { obj } must be a Pydantic model or dataclass Message" )
127+
128+
129+ def remove_iris_id (message : Any ) -> Any :
130+ try :
131+ del message ._iris_id
132+ except AttributeError :
133+ pass
134+ return message
115135
116136def dataclass_from_dict (klass : Type | Any , dikt : Dict ) -> Any :
117137 """Converts a dictionary to a dataclass instance.
0 commit comments