def serialize(cls, value, ctx): type_id = register.get_id(cls) is_ref, hash_code = ctx.is_ref(value) ctx.write(struct.pack('<i?i', type_id, is_ref, hash_code)) if is_ref: return length = len(value) ctx.write(struct.pack('<i', length)) for item in value: _type, _item = decide(item) _type_id = register.get_id(_type) ctx.write(struct.pack('<i', _type_id)) _type.serialize(_item, ctx)
def serialize(cls, value, ctx): type_id = register.get_id(cls) is_ref, hash_code = ctx.is_ref(value) ctx.write(struct.pack('<i?i', type_id, is_ref, hash_code)) if is_ref: return k, v = value key_type, k = decide(k) key_type_id = register.get_id(key_type) ctx.write(struct.pack('<i', key_type_id)) key_type.serialize(k, ctx) value_type, v = decide(v) value_type_id = register.get_id(value_type) ctx.write(struct.pack('<i', value_type_id)) value_type.serialize(v, ctx)
def serialize(cls, value, ctx): type_id = register.get_id(cls) is_ref, hash_code = ctx.is_ref(value) ctx.write(struct.pack('<i?i', type_id, is_ref, hash_code)) if is_ref: return # Serializable的子类中记录了属性的序列化类型 # 所以实例属性不需要像容器类型一样限定成ProtocolType类型 # 但是如果实例属性是ProtocolType类型,也是允许的 for desc in cls.__serialize_fields__: _value = getattr(value, desc.name) _type = desc.type_info.type if _type == ProtocolType: _type, _value = decide(_value) else: _, _value = decide(_value) type_id = register.get_id(_type) ctx.write(struct.pack('<i', type_id)) _type.serialize(_value, ctx)
def serialize(cls, value, ctx): _type = cls.__generics__ type_id = register.get_id(_type) is_ref, hash_code = ctx.is_ref(value) ctx.write(struct.pack('<i?i', type_id, is_ref, hash_code)) if is_ref: return arr = value.value length = len(arr) ctx.write(struct.pack('<i', length)) if issubclass(_type, BaseType): for item in arr: _type.serialize(item, ctx) else: for item in arr: _item_type, _item = decide(item) _item_type_id = register.get_id(_item_type) ctx.write(struct.pack('<i', _item_type_id)) _item_type.serialize(_item, ctx)
def serialize(cls, value, ctx): type_id = register.get_id(cls) ctx.write(struct.pack('<i', type_id)) enum_str = cls.name(value) String.serialize(enum_str, ctx)