def _write_field(cls, tokenizer, output_str, descriptor, value): if descriptor.type == FieldType.String: tokenizer.write_int(output_str, len(value), FieldType.Int32) tokenizer.write_str(output_str, value) elif descriptor.type >= FieldType.Int8 and descriptor.type <= FieldType.Int64: tokenizer.write_int(output_str, value, descriptor.type) elif descriptor.type == FieldType.List: tokenizer.write_int(output_str, len(value), FieldType.Int32) if descriptor.list_item_type != FieldType.Object: list_item_descriptor = _FieldDescriptor(None, descriptor.list_item_type) for item in value: cls._write_field(tokenizer, output_str, list_item_descriptor, item) else: for item in value: cls._write_object(tokenizer, output_str, descriptor.list_item_class.get_descriptor(), item) elif descriptor.type == FieldType.Object: cls._write_object(tokenizer, output_str, descriptor.object_class.get_descriptor(), value)
def _read_field(cls, tokenizer, input_str, descriptor): if descriptor.type == FieldType.String: str_len = tokenizer.read_int(input_str, FieldType.Int32) return tokenizer.read_str(input_str, str_len) elif descriptor.type >= FieldType.Int8 and descriptor.type <= FieldType.Int64: return tokenizer.read_int(input_str, descriptor.type) elif descriptor.type == FieldType.List: array_len = tokenizer.read_int(input_str, FieldType.Int32) array = [] if descriptor.list_item_class is not None: for _ in range(array_len): array.append(cls._read_object(tokenizer, input_str, descriptor.list_item_class)) else: array_item_descriptor = _FieldDescriptor(None, descriptor.list_item_type) for _ in range(array_len): array.append(cls._read_field(tokenizer, input_str, array_item_descriptor)) return array elif descriptor.type == FieldType.Object: return cls._read_object(tokenizer, input_str, descriptor.object_class)