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
@@ -58,8 +59,8 @@ def from_dict(message: dict, harmonization=None,
5859 return class_reference (message , auto = True , harmonization = harmonization )
5960
6061 @staticmethod
61- def unserialize (raw_message : str , harmonization : dict = None ,
62- default_type : Optional [str ] = None ) -> dict :
62+ def unserialize (raw_message : bytes , harmonization : dict = None ,
63+ default_type : Optional [str ] = None , use_packer : str = "msgpack" ) -> dict :
6364 """
6465 Takes JSON-encoded Message object, returns instance of correct class.
6566
@@ -72,12 +73,12 @@ def unserialize(raw_message: str, harmonization: dict = None,
7273 MessageFactory.from_dict
7374 MessageFactory.serialize
7475 """
75- message = Message .unserialize (raw_message )
76+ message = Message .unserialize (raw_message , use_packer = use_packer )
7677 return MessageFactory .from_dict (message , harmonization = harmonization ,
7778 default_type = default_type )
7879
7980 @staticmethod
80- def serialize (message ):
81+ def serialize (message ) -> bytes :
8182 """
8283 Takes instance of message-derived class and makes JSON-encoded Message.
8384
@@ -125,7 +126,7 @@ def __init__(self, message: Union[dict, tuple] = (), auto: bool = False,
125126 elif isinstance (message , tuple ):
126127 self .iterable = dict (message )
127128 else :
128- raise ValueError ("Type %r of message can't be handled, must be dict or tuple." , type (message ))
129+ raise ValueError ("Type %r of message can't be handled, must be dict or tuple." % type (message ))
129130 for key , value in self .iterable .items ():
130131 if not self .add (key , value , sanitize = False , raise_failure = False ):
131132 self .add (key , value , sanitize = True )
@@ -308,18 +309,32 @@ def deep_copy(self):
308309 harmonization = {self .__class__ .__name__ .lower (): self .harmonization_config })
309310
310311 def __str__ (self ):
311- return self .serialize ()
312+ return self .serialize (use_packer = "json" )
312313
313- def serialize (self ):
314- self ['__type' ] = self .__class__ .__name__
315- json_dump = utils .decode (json .dumps (self ))
316- del self ['__type' ]
317- return json_dump
314+ def serialize (self , use_packer : str = "msgpack" ):
315+ delete_type = False
316+ if '__type' not in self :
317+ delete_type = True
318+ self ['__type' ] = self .__class__ .__name__
319+
320+ if use_packer == "json" :
321+ packed = json .dumps (self )
322+ else :
323+ packed = msgpack .packb (self )
324+
325+ if delete_type :
326+ del self ['__type' ]
327+ return packed
318328
319329 @staticmethod
320- def unserialize (message_string : str ):
321- message = json .loads (message_string )
322- return message
330+ def unserialize (message : bytes , use_packer : str = "msgpack" ):
331+ try :
332+ if use_packer == "json" :
333+ return json .loads (message )
334+ else :
335+ return msgpack .unpackb (message , raw = False )
336+ except Exception as exc :
337+ raise exceptions .UnserializationError (exception = exc , object = message )
323338
324339 def __is_valid_key (self , key : str ):
325340 try :
@@ -466,14 +481,18 @@ def to_dict(self, hierarchical: bool = False, with_type: bool = False,
466481 json_dict_fp = json_dict_fp [subkey ]
467482
468483 for key , value in jsondicts .items ():
469- new_dict [key ] = json .dumps (value , ensure_ascii = False )
484+ new_dict [key ] = json .dumps (value )
470485
471486 return new_dict
472487
473488 def to_json (self , hierarchical = False , with_type = False , jsondict_as_string = False ):
474489 json_dict = self .to_dict (hierarchical = hierarchical , with_type = with_type )
475490 return json .dumps (json_dict , ensure_ascii = False , sort_keys = True )
476491
492+ def to_msgpack (self , hierarchical = False , with_type = False ):
493+ msgpack_dict = self .to_dict (hierarchical = hierarchical , with_type = with_type )
494+ return msgpack .packb (msgpack_dict )
495+
477496 def __eq__ (self , other : dict ) -> bool :
478497 """
479498 Wrapper is necessary as we have additional members
0 commit comments