Skip to content

Commit c26690f

Browse files
committed
Fix serialization / deserialization of char array.
1 parent 8472ed9 commit c26690f

File tree

3 files changed

+12
-4
lines changed

3 files changed

+12
-4
lines changed

javaobj.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ def read_to_str(data):
126126
"""
127127
return ''.join(chr(char) for char in data)
128128

129+
unichr = chr
130+
129131
else:
130132
# Python 2 interpreter : str & unicode
131133
def to_str(data, encoding="UTF-8"):
@@ -1078,10 +1080,7 @@ def _read_value(self, field_type, ident, name=""):
10781080
elif field_type == self.TYPE_BYTE:
10791081
(res,) = self._readStruct(">b")
10801082
elif field_type == self.TYPE_CHAR:
1081-
# TYPE_CHAR is defined by the serialization specification
1082-
# but not used in the implementation, so this is
1083-
# a hypothetical code
1084-
res = bytes(self._readStruct(">bb")).decode("utf-16-be")
1083+
res = unichr(self._readStruct(">H")[0])
10851084
elif field_type == self.TYPE_SHORT:
10861085
(res,) = self._readStruct(">h")
10871086
elif field_type == self.TYPE_INTEGER:
@@ -1531,6 +1530,8 @@ def _write_value(self, field_type, value):
15311530
self._writeStruct(">B", 1, (1 if value else 0,))
15321531
elif field_type == self.TYPE_BYTE:
15331532
self._writeStruct(">b", 1, (value,))
1533+
elif field_type == self.TYPE_CHAR:
1534+
self._writeStruct(">H", 1, (ord(value),))
15341535
elif field_type == self.TYPE_SHORT:
15351536
self._writeStruct(">h", 1, (value,))
15361537
elif field_type == self.TYPE_INTEGER:

tests/testCharArray.ser

41 Bytes
Binary file not shown.

tests/tests.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,13 @@ def test_arrays(self):
280280

281281
self._try_marshalling(jobj, pobj)
282282

283+
def test_char_array(self):
284+
jobj = self.read_file("testCharArray.ser")
285+
pobj = javaobj.loads(jobj)
286+
_logger.debug(pobj)
287+
self.assertEqual(pobj, ['\u0000', '\ud800', '\u0001', '\udc00', '\u0002', '\uffff', '\u0003'])
288+
self._try_marshalling(jobj, pobj)
289+
283290
def test_enums(self):
284291
jobj = self.read_file("objEnums.ser")
285292
pobj = javaobj.loads(jobj)

0 commit comments

Comments
 (0)