def deserialize(cls, ctx): (type_id, is_ref, hash_code, ) = struct.unpack('<i?i', ctx.read(9)) if type_id == 0: return None if is_ref: return ctx.ref(hash_code) (key_type_id, ) = struct.unpack('<i', ctx.read(4)) key = register.get(key_type_id).deserialize(ctx) (value_type_id, ) = struct.unpack('<i', ctx.read(4)) value = register.get(value_type_id).deserialize(ctx) obj = key, value ctx.ref(hash_code, obj) return obj
def as_dict(self, include_class_info=True, span_keys=None): from register import register ret = {} keys_to_span = span_keys or self._span_keys for prop in self: p = self.model._properties[prop] # If this property should be spanned try to. if keys_to_span and prop in keys_to_span and isinstance(p, ndb.KeyProperty): key = getattr(self.instance, prop) related = key.get() # Use custom resource class if registered, fallback to defaults # if not. if register.is_registered(related.__class__): ResourceHandler = register.get(related.__class__)[1] if ResourceHandler is not None: ResourceClass = ResourceHandler.resource_class else: ResourceClass = resource_for_model(related.__class__) ret[prop] = ResourceClass(related).as_dict(include_class_info=include_class_info) continue ret[prop] = val_to_str(p, getattr(self.instance, prop)) ret['id'] = self.instance.key.id() if include_class_info: ret['model'] = self.instance.__class__.__name__ return ret
def deserialize(cls, ctx): (type_id, is_ref, hash_code, ) = struct.unpack('<i?i', ctx.read(9)) if type_id == 0: return None if is_ref: return ctx.ref(hash_code) length = struct.pack('<i', ctx.read(4)) _type = register.get(type_id) obj = dict() for i in xrange(length): (key_type_id, ) = struct.unpack('<i', ctx.read(4)) key_type = register.get(key_type_id) key = key_type.deserialize(ctx) (value_type_id,) = struct.unpack('<i', ctx.read(4)) value_type = register.get(value_type_id) value = value_type.deserialize(ctx) obj[key] = value ctx.ref(hash_code, obj) return obj
def deserialize(cls, ctx): (type_id, is_ref, hash_code, ) = struct.unpack('<i?i', ctx.read(9)) if type_id == 0: return None if is_ref: return ctx.ref(hash_code) (length, ) = struct.unpack('<i', ctx.read(4)) _type = register.get(type_id) obj = list() if issubclass(_type, BaseType): # 如果是基本类型(Serializable,容器以外的类型) # 则使用_type for i in xrange(length): obj.append(_type.deserialize(ctx)) else: # 否则使用数据中的type for i in xrange(length): (item_type_id, ) = struct.unpack('<i', ctx.read(4)) obj.append(register.get(item_type_id).deserialize(ctx)) ctx.ref(hash_code, obj) return obj
def deserialize(cls, ctx): (type_id, is_ref, hash_code, ) = struct.unpack('<i?i', ctx.read(9)) if type_id == 0: return None if is_ref: return ctx.ref(hash_code) length = struct.pack('<i', ctx.read(4)) obj = set() for i in xrange(length): (item_type_id, ) = struct.unpack('<i', ctx.read(4)) obj.add(register.get(item_type_id).deserialize(ctx)) ctx.ref(hash_code, obj) return obj
def checked_type(cls, type_id, type_cls): excepted = register.get(type_id) real = type_cls if excepted != Null and not issubclass(excepted, real): raise RuntimeError('Excepted type is [{excepted}], but real type is [{real}]'.format(excepted=excepted, real=real)) return excepted