@@ -161,7 +161,8 @@ def load(file_object, *transformers, **kwargs):
161161 # Read keyword argument
162162 ignore_remaining_data = kwargs .get ('ignore_remaining_data' , False )
163163
164- marshaller = JavaObjectUnmarshaller (file_object )
164+ marshaller = JavaObjectUnmarshaller (
165+ file_object , kwargs .get ('use_numpy_arrays' , False ))
165166
166167 # Add custom transformers first
167168 for transformer in transformers :
@@ -413,6 +414,17 @@ class JavaObjectConstants(object):
413414
414415 BASE_REFERENCE_IDX = 0x7E0000
415416
417+ NUMPY_TYPE_MAP = {
418+ TYPE_BYTE : 'B' ,
419+ TYPE_CHAR : 'b' ,
420+ TYPE_DOUBLE : '>d' ,
421+ TYPE_FLOAT : '>f' ,
422+ TYPE_INTEGER : '>i' ,
423+ TYPE_LONG : '>l' ,
424+ TYPE_SHORT : '>h' ,
425+ TYPE_BOOLEAN : '>B'
426+ }
427+
416428
417429class OpCodeDebug (object ):
418430 # Type codes
@@ -453,13 +465,15 @@ class JavaObjectUnmarshaller(JavaObjectConstants):
453465 """
454466 Deserializes a Java serialization stream
455467 """
456- def __init__ (self , stream ):
468+ def __init__ (self , stream , use_numpy_arrays = False ):
457469 """
458470 Sets up members
459471
460472 :param stream: An input stream (opened in binary/bytes mode)
461473 :raise IOError: Invalid input stream
462474 """
475+ self .use_numpy_arrays = use_numpy_arrays
476+
463477 # Check stream
464478 if stream is None :
465479 raise IOError ("No input stream given" )
@@ -915,6 +929,12 @@ def do_array(self, parent=None, ident=0):
915929 array .append (res )
916930 elif type_char == self .TYPE_BYTE :
917931 array = JavaByteArray (self .object_stream .read (size ), classdesc )
932+ elif self .use_numpy_arrays and type_char != self .TYPE_BYTE :
933+ import numpy
934+ array = numpy .fromfile (
935+ self .object_stream ,
936+ dtype = JavaObjectConstants .NUMPY_TYPE_MAP [type_char ],
937+ count = size )
918938 else :
919939 for _ in range (size ):
920940 res = self ._read_value (type_char , ident )
0 commit comments