Skip to content

Commit cebef99

Browse files
committed
[#374] Improve initialize_offsets calling in Python serialization
1 parent b359f9b commit cebef99

File tree

2 files changed

+40
-13
lines changed

2 files changed

+40
-13
lines changed

compiler/extensions/python/runtime/src/zserio/serialization.py

+17-10
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from zserio.bitbuffer import BitBuffer
99
from zserio.bitreader import BitStreamReader
1010

11-
def serialize(obj: typing.Any) -> BitBuffer:
11+
def serialize(obj: typing.Any, *, call_initialize_offsets = True) -> BitBuffer:
1212
"""
1313
Serializes generated object to the bit buffer.
1414
@@ -28,13 +28,12 @@ def serialize(obj: typing.Any) -> BitBuffer:
2828
bitbuffer = zserio.serialize(obj)
2929
3030
:param obj: Generated object to serialize.
31+
:param call_initialize_offsets: True to call initialize_offsets() method on generated object.
3132
:returns: Bit buffer which represents generated object in binary format.
3233
:raises PythonRuntimeException: Throws in case of any error during serialization.
3334
"""
3435

35-
writer = BitStreamWriter()
36-
obj.initialize_offsets(writer.bitposition)
37-
obj.write(writer)
36+
writer = _serialize(obj, call_initialize_offsets)
3837

3938
return BitBuffer(writer.byte_array, writer.bitposition)
4039

@@ -62,7 +61,7 @@ def deserialize(obj_class: typing.Type[typing.Any], bitbuffer: BitBuffer, *args)
6261

6362
return obj_class.from_reader(reader, *args)
6463

65-
def serialize_to_bytes(obj: typing.Any) -> bytes:
64+
def serialize_to_bytes(obj: typing.Any, *, call_initialize_offsets = True) -> bytes:
6665
"""
6766
Serializes generated object to the byte buffer.
6867
@@ -84,11 +83,12 @@ def serialize_to_bytes(obj: typing.Any) -> bytes:
8483
buffer = zserio.serialize_to_bytes(obj)
8584
8685
:param obj: Generated object to serialize.
86+
:param call_initialize_offsets: True to call initialize_offsets() method on generated object.
8787
:returns: Bytes which represents generated object in binary format.
8888
:raises PythonRuntimeException: Throws in case of any error during serialization.
8989
"""
9090

91-
bitbuffer = serialize(obj)
91+
bitbuffer = serialize(obj, call_initialize_offsets = call_initialize_offsets)
9292

9393
return bitbuffer.buffer
9494

@@ -120,7 +120,7 @@ def deserialize_bytes(obj_class: typing.Type[typing.Any], buffer: bytes, *args)
120120

121121
return deserialize(obj_class, bitbuffer, *args)
122122

123-
def serialize_to_file(obj: typing.Any, filename: str) -> None:
123+
def serialize_to_file(obj: typing.Any, filename: str, *, call_initialize_offsets = True) -> None:
124124
"""
125125
Serializes generated object to the file.
126126
@@ -138,13 +138,12 @@ def serialize_to_file(obj: typing.Any, filename: str) -> None:
138138
buffer = zserio.serialize_to_file(obj, "file_name.bin")
139139
140140
:param obj: Generated object to serialize.
141+
:param call_initialize_offsets: True to call initialize_offsets() method on generated object.
141142
:param filename: File to write.
142143
:raises PythonRuntimeException: Throws in case of any error during serialization.
143144
"""
144145

145-
writer = BitStreamWriter()
146-
obj.initialize_offsets(writer.bitposition)
147-
obj.write(writer)
146+
writer = _serialize(obj, call_initialize_offsets)
148147
writer.to_file(filename)
149148

150149
def deserialize_from_file(obj_class: typing.Type[typing.Any], filename: str, *args) -> typing.Any:
@@ -171,3 +170,11 @@ def deserialize_from_file(obj_class: typing.Type[typing.Any], filename: str, *ar
171170
reader = BitStreamReader.from_file(filename)
172171

173172
return obj_class.from_reader(reader, *args)
173+
174+
def _serialize(obj: typing.Any, call_initialize_offsets: bool) -> BitStreamWriter:
175+
writer = BitStreamWriter()
176+
if call_initialize_offsets:
177+
obj.initialize_offsets(writer.bitposition)
178+
obj.write(writer)
179+
180+
return writer

compiler/extensions/python/runtime/tests/test_serialization.py

+23-3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ def from_reader(cls, reader, parameter):
2121
def get_value(self):
2222
return self._value
2323

24+
def offsets_initalized(self):
25+
return self._offsets_initialized
26+
2427
@staticmethod
2528
def bitsizeof(_bitposition = 0):
2629
return 31 # to make an unaligned type
@@ -33,19 +36,23 @@ def read(self, reader):
3336
self._value = reader.read_bits(self.bitsizeof(0))
3437

3538
def write(self, writer):
36-
# don't write anything if offsets are not initialized to force test failure
37-
if self._offsets_initialized:
38-
writer.write_bits(self._value, self.bitsizeof(0))
39+
writer.write_bits(self._value, self.bitsizeof(0))
3940

4041
class SerializationTest(unittest.TestCase):
4142

4243
def test_serialize(self):
4344
dummy_object = DummyObject(0xAB, 0xDEAD)
4445
bitbuffer = serialize(dummy_object)
46+
self.assertTrue(dummy_object.offsets_initalized())
4547
expected_bitsize = 31
4648
self.assertEqual(expected_bitsize, bitbuffer.bitsize)
4749
self.assertEqual(b'\x00\x01\xBD\x5A', bitbuffer.buffer)
4850

51+
def test_serialize_skip_offsets(self):
52+
dummy_object = DummyObject(0xAB, 0xDEAD)
53+
serialize(dummy_object, call_initialize_offsets = False)
54+
self.assertFalse(dummy_object.offsets_initalized())
55+
4956
def test_deserialize(self):
5057
bitbuffer = BitBuffer(b'\x00\x01\xBD\x5A', 31)
5158
dummy_object = deserialize(DummyObject, bitbuffer, 0xAB)
@@ -58,10 +65,16 @@ def test_deserialize(self):
5865
def test_serialize_to_bytes(self):
5966
dummy_object = DummyObject(0xAB, 0xDEAD)
6067
buffer = serialize_to_bytes(dummy_object)
68+
self.assertTrue(dummy_object.offsets_initalized())
6169
expected_bitsize = 31
6270
self.assertEqual((expected_bitsize + 7) // 8, len(buffer))
6371
self.assertEqual(b'\x00\x01\xBD\x5A', buffer)
6472

73+
def test_serialize_to_bytes_skip_offsets(self):
74+
dummy_object = DummyObject(0xAB, 0xDEAD)
75+
serialize_to_bytes(dummy_object, call_initialize_offsets = False)
76+
self.assertFalse(dummy_object.offsets_initalized())
77+
6578
def test_deserialize_bytes(self):
6679
buffer = b'\x00\x01\xBD\x5A'
6780
dummy_object = deserialize_bytes(DummyObject, buffer, 0xAB)
@@ -71,5 +84,12 @@ def test_to_file_from_file(self):
7184
dummy_object = DummyObject(0xAB, 0xDEAD)
7285
filename = "SerializationTest.bin"
7386
serialize_to_file(dummy_object, filename)
87+
self.assertTrue(dummy_object.offsets_initalized())
7488
read_dummy_object = deserialize_from_file(DummyObject, filename, 0xAB)
7589
self.assertEqual(dummy_object.get_value(), read_dummy_object.get_value())
90+
91+
def test_to_file_from_file_skip_offsets(self):
92+
dummy_object = DummyObject(0xAB, 0xDEAD)
93+
filename = "SerializationTest.bin"
94+
serialize_to_file(dummy_object, filename, call_initialize_offsets = False)
95+
self.assertFalse(dummy_object.offsets_initalized())

0 commit comments

Comments
 (0)