X-Git-Url: https://code.kerkeslager.com/?p=sandbox;a=blobdiff_plain;f=serial%2Fserial%2Fbinary.py;fp=serial%2Fserial%2Fbinary.py;h=444db4f92a408aed723f9c35d1263c3e949c1374;hp=dd1b990ee7e570349d9d6a3e71ab08e1c13a87bb;hb=0bc1ffa1b3ab590b06cc172a86b5a185324e878c;hpb=96862790bcf36293287aba0d2211c7aa5344578c diff --git a/serial/serial/binary.py b/serial/serial/binary.py index dd1b990..444db4f 100644 --- a/serial/serial/binary.py +++ b/serial/serial/binary.py @@ -62,7 +62,25 @@ def _serialize_list(to): return struct.pack(fmt, tags.LIST, list_tag, len(payload)) + payload def _serialize_object(to): - raise Exception('Not implemented') + assert isinstance(to.instance, list) + + # TODO Actually handle this case somehow + assert len(to.instance) > 0 + + # TODO Do this a better way + serialized_kvps = [(serialize(k), serialize(v)) for k,v in to.instance] + key_type_tag = serialized_kvps[0][0][0] + + def check_and_strip_prefix(b): + item_tag = b[0] + assert key_type_tag == item_tag + return b[1:] + + payload = b''.join(check_and_strip_prefix(k) + v for k,v in serialized_kvps) + + fmt = '!BBI' + + return struct.pack(fmt, tags.OBJECT, key_type_tag, len(payload)) + payload _TAGS_TO_SERIALIZERS = { tags.NULL: _make_tag_only_serializer(tags.NULL, None),