1010import warnings
1111from collections import defaultdict
1212from typing import Any , Dict , Iterable , Optional , Sequence , Union
13+ import msgpack
1314
1415import intelmq .lib .exceptions as exceptions
1516import intelmq .lib .harmonization
@@ -54,8 +55,8 @@ def from_dict(message: dict, harmonization=None,
5455 return class_reference (message , auto = True , harmonization = harmonization )
5556
5657 @staticmethod
57- def unserialize (raw_message : str , harmonization : dict = None ,
58- default_type : Optional [str ] = None ) -> dict :
58+ def unserialize (raw_message : bytes , harmonization : dict = None ,
59+ default_type : Optional [str ] = None , use_packer : str = "msgpack" ) -> dict :
5960 """
6061 Takes JSON-encoded Message object, returns instance of correct class.
6162
@@ -68,12 +69,12 @@ def unserialize(raw_message: str, harmonization: dict = None,
6869 MessageFactory.from_dict
6970 MessageFactory.serialize
7071 """
71- message = Message .unserialize (raw_message )
72+ message = Message .unserialize (raw_message , use_packer = use_packer )
7273 return MessageFactory .from_dict (message , harmonization = harmonization ,
7374 default_type = default_type )
7475
7576 @staticmethod
76- def serialize (message ):
77+ def serialize (message ) -> bytes :
7778 """
7879 Takes instance of message-derived class and makes JSON-encoded Message.
7980
@@ -121,7 +122,7 @@ def __init__(self, message: Union[dict, tuple] = (), auto: bool = False,
121122 elif isinstance (message , tuple ):
122123 self .iterable = dict (message )
123124 else :
124- raise ValueError ("Type %r of message can't be handled, must be dict or tuple." , type (message ))
125+ raise ValueError ("Type %r of message can't be handled, must be dict or tuple." % type (message ))
125126 for key , value in self .iterable .items ():
126127 if not self .add (key , value , sanitize = False , raise_failure = False ):
127128 self .add (key , value , sanitize = True )
@@ -304,18 +305,32 @@ def deep_copy(self):
304305 harmonization = {self .__class__ .__name__ .lower (): self .harmonization_config })
305306
306307 def __str__ (self ):
307- return self .serialize ()
308+ return self .serialize (use_packer = "json" )
308309
309- def serialize (self ):
310- self ['__type' ] = self .__class__ .__name__
311- json_dump = utils .decode (json .dumps (self ))
312- del self ['__type' ]
313- return json_dump
310+ def serialize (self , use_packer : str = "msgpack" ):
311+ delete_type = False
312+ if '__type' not in self :
313+ delete_type = True
314+ self ['__type' ] = self .__class__ .__name__
315+
316+ if use_packer == "json" :
317+ packed = json .dumps (self )
318+ else :
319+ packed = msgpack .packb (self )
320+
321+ if delete_type :
322+ del self ['__type' ]
323+ return packed
314324
315325 @staticmethod
316- def unserialize (message_string : str ):
317- message = json .loads (message_string )
318- return message
326+ def unserialize (message : bytes , use_packer : str = "msgpack" ):
327+ try :
328+ if use_packer == "json" :
329+ return json .loads (message )
330+ else :
331+ return msgpack .unpackb (message )
332+ except Exception as exc :
333+ raise exceptions .UnserializationError (exception = exc , object = message )
319334
320335 def __is_valid_key (self , key : str ):
321336 try :
@@ -462,14 +477,18 @@ def to_dict(self, hierarchical: bool = False, with_type: bool = False,
462477 json_dict_fp = json_dict_fp [subkey ]
463478
464479 for key , value in jsondicts .items ():
465- new_dict [key ] = json .dumps (value , ensure_ascii = False )
480+ new_dict [key ] = json .dumps (value )
466481
467482 return new_dict
468483
469484 def to_json (self , hierarchical = False , with_type = False , jsondict_as_string = False ):
470485 json_dict = self .to_dict (hierarchical = hierarchical , with_type = with_type )
471486 return json .dumps (json_dict , ensure_ascii = False , sort_keys = True )
472487
488+ def to_msgpack (self , hierarchical = False , with_type = False ):
489+ msgpack_dict = self .to_dict (hierarchical = hierarchical , with_type = with_type )
490+ return msgpack .packb (msgpack_dict )
491+
473492 def __eq__ (self , other : dict ) -> bool :
474493 """
475494 Wrapper is necessary as we have additional members
0 commit comments