1515import iris
1616
1717from iop ._utils import _Utils
18+ from pydantic import BaseModel
1819
1920# Constants
2021DATETIME_FORMAT_LENGTH = 23
@@ -91,6 +92,8 @@ class IrisJSONEncoder(json.JSONEncoder):
9192 """JSONEncoder that handles dates, decimals, UUIDs, etc."""
9293
9394 def default (self , obj : Any ) -> Any :
95+ if isinstance (obj , BaseModel ):
96+ return obj .model_dump ()
9497 if obj .__class__ .__name__ == 'DataFrame' :
9598 return f'dataframe:{ TypeConverter .convert_to_string ("dataframe" , obj )} '
9699 elif isinstance (obj , datetime .datetime ):
@@ -134,6 +137,9 @@ class MessageSerializer:
134137 @staticmethod
135138 def serialize (message : Any , use_pickle : bool = False ) -> iris .cls :
136139 """Serializes a message to IRIS format."""
140+ if isinstance (message , BaseModel ):
141+ return (MessageSerializer ._serialize_pickle (message )
142+ if use_pickle else MessageSerializer ._serialize_json (message ))
137143 if use_pickle :
138144 return MessageSerializer ._serialize_pickle (message )
139145 return MessageSerializer ._serialize_json (message )
@@ -155,7 +161,11 @@ def _serialize_pickle(message: Any) -> iris.cls:
155161
156162 @staticmethod
157163 def _serialize_json (message : Any ) -> iris .cls :
158- json_string = json .dumps (message , cls = IrisJSONEncoder , ensure_ascii = False )
164+ if isinstance (message , BaseModel ):
165+ json_string = json .dumps (message .model_dump (), cls = IrisJSONEncoder , ensure_ascii = False )
166+ else :
167+ json_string = json .dumps (message , cls = IrisJSONEncoder , ensure_ascii = False )
168+
159169 msg = iris .cls ('IOP.Message' )._New ()
160170 msg .classname = f"{ message .__class__ .__module__ } .{ message .__class__ .__name__ } "
161171
@@ -187,7 +197,10 @@ def _deserialize_json(serial: iris.cls) -> Any:
187197
188198 try :
189199 json_dict = json .loads (json_string , cls = IrisJSONDecoder )
190- return dataclass_from_dict (msg_class , json_dict )
200+ if issubclass (msg_class , BaseModel ):
201+ return msg_class .model_validate (json_dict )
202+ else :
203+ return dataclass_from_dict (msg_class , json_dict )
191204 except Exception as e :
192205 raise SerializationError (f"Failed to deserialize JSON: { str (e )} " )
193206
0 commit comments