1414import warnings
1515from collections import defaultdict
1616from typing import Any , Dict , Iterable , Optional , Sequence , Union
17+ import msgpack
1718
1819import intelmq .lib .exceptions as exceptions
1920import intelmq .lib .harmonization
@@ -60,8 +61,8 @@ def from_dict(message: dict, harmonization=None,
6061 return class_reference (message , auto = True , harmonization = harmonization )
6162
6263 @staticmethod
63- def unserialize (raw_message : str , harmonization : dict = None ,
64- default_type : Optional [str ] = None ) -> dict :
64+ def unserialize (raw_message : bytes , harmonization : dict = None ,
65+ default_type : Optional [str ] = None , use_packer : str = "msgpack" ) -> dict :
6566 """
6667 Takes JSON-encoded Message object, returns instance of correct class.
6768
@@ -74,12 +75,12 @@ def unserialize(raw_message: str, harmonization: dict = None,
7475 MessageFactory.from_dict
7576 MessageFactory.serialize
7677 """
77- message = Message .unserialize (raw_message )
78+ message = Message .unserialize (raw_message , use_packer = use_packer )
7879 return MessageFactory .from_dict (message , harmonization = harmonization ,
7980 default_type = default_type )
8081
8182 @staticmethod
82- def serialize (message ):
83+ def serialize (message ) -> bytes :
8384 """
8485 Takes instance of message-derived class and makes JSON-encoded Message.
8586
@@ -127,7 +128,7 @@ def __init__(self, message: Union[dict, tuple] = (), auto: bool = False,
127128 elif isinstance (message , tuple ):
128129 self .iterable = dict (message )
129130 else :
130- raise ValueError ("Type %r of message can't be handled, must be dict or tuple." , type (message ))
131+ raise ValueError ("Type %r of message can't be handled, must be dict or tuple." % type (message ))
131132 for key , value in self .iterable .items ():
132133 if not self .add (key , value , sanitize = False , raise_failure = False ):
133134 self .add (key , value , sanitize = True )
@@ -310,18 +311,32 @@ def deep_copy(self):
310311 harmonization = {self .__class__ .__name__ .lower (): self .harmonization_config })
311312
312313 def __str__ (self ):
313- return self .serialize ()
314+ return self .serialize (use_packer = "json" )
314315
315- def serialize (self ):
316- self ['__type' ] = self .__class__ .__name__
317- json_dump = utils .decode (json .dumps (self ))
318- del self ['__type' ]
319- return json_dump
316+ def serialize (self , use_packer : str = "msgpack" ):
317+ delete_type = False
318+ if '__type' not in self :
319+ delete_type = True
320+ self ['__type' ] = self .__class__ .__name__
321+
322+ if use_packer == "json" :
323+ packed = json .dumps (self )
324+ else :
325+ packed = msgpack .packb (self )
326+
327+ if delete_type :
328+ del self ['__type' ]
329+ return packed
320330
321331 @staticmethod
322- def unserialize (message_string : str ):
323- message = json .loads (message_string )
324- return message
332+ def unserialize (message : bytes , use_packer : str = "msgpack" ):
333+ try :
334+ if use_packer == "json" :
335+ return json .loads (message )
336+ else :
337+ return msgpack .unpackb (message , raw = False )
338+ except Exception as exc :
339+ raise exceptions .UnserializationError (exception = exc , object = message )
325340
326341 def __is_valid_key (self , key : str ):
327342 try :
@@ -470,14 +485,18 @@ def to_dict(self, hierarchical: bool = False, with_type: bool = False,
470485 json_dict_fp = json_dict_fp [subkey ]
471486
472487 for key , value in jsondicts .items ():
473- new_dict [key ] = json .dumps (value , ensure_ascii = False )
488+ new_dict [key ] = json .dumps (value )
474489
475490 return new_dict
476491
477492 def to_json (self , hierarchical = False , with_type = False , jsondict_as_string = False ):
478493 json_dict = self .to_dict (hierarchical = hierarchical , with_type = with_type )
479494 return json .dumps (json_dict , ensure_ascii = False , sort_keys = True )
480495
496+ def to_msgpack (self , hierarchical = False , with_type = False ):
497+ msgpack_dict = self .to_dict (hierarchical = hierarchical , with_type = with_type )
498+ return msgpack .packb (msgpack_dict )
499+
481500 def __eq__ (self , other : dict ) -> bool :
482501 """
483502 Wrapper is necessary as we have additional members
0 commit comments