Skip to content

Commit 99ecc41

Browse files
vmarkovtsevtcalmant
authored andcommitted
Add optional fast deserialization to numpy arrays
1 parent 613de8f commit 99ecc41

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

javaobj.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

417429
class 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

Comments
 (0)