def _get_class_name(self, _class): """ 根据一个字段的类型得到其在Java中对应类的全限定名 转换规则:https://stackoverflow.com/a/3442100/4614538 :param _class: :return: """ if isinstance(_class, bool): # bool类型的判断必须放在int类型判断的前面 return 'Z' elif isinstance(_class, int): if MIN_INT_32 <= _class <= MAX_INT_32: return 'I' else: return 'J' elif isinstance(_class, float): return 'D' elif isinstance(_class, str): return 'L' + 'java/lang/String' + ';' elif isinstance(_class, Object): path = _class.get_path() path = 'L' + path.replace('.', '/') + ';' return path elif isinstance(_class, list): if len(_class) == 0: raise HessianTypeError('Method parameter {} is a list but length is zero'.format(_class)) return '[' + self._get_class_name(_class[0]) else: raise HessianTypeError('Unknown argument type: {0}'.format(_class))
def _encode_list(self, value): """ 对一个列表进行编码 :param value: :return: """ result = [] length = len(value) if length == 0: # 没有值则无法判断类型,一律返回null return self._encode_single_value(None) if isinstance(value[0], bool): _type = '[boolean' elif isinstance(value[0], int): _type = '[int' elif isinstance(value[0], float): _type = '[double' elif isinstance(value[0], str): _type = '[string' elif isinstance(value[0], Object): _type = '[object' else: raise HessianTypeError('Unknown list type: {}'.format(value[0])) if length < 0x7: result.append(0x70 + length) if _type not in self.types: self.types.append(_type) result.extend(self._encode_single_value(_type)) else: result.extend( self._encode_single_value(self.types.index(_type))) else: result.append(0x56) if _type not in self.types: self.types.append(_type) result.extend(self._encode_single_value(_type)) else: result.extend( self._encode_single_value(self.types.index(_type))) result.extend(self._encode_single_value(length)) for v in value: if type(value[0]) != type(v): raise HessianTypeError( 'All elements in list must be the same type, first type' ' is {0} but current type is {1}'.format( type(value[0]), type(v))) result.extend(self._encode_single_value(v)) return result
def _encode_single_value(self, value): """ 根据hessian协议对单个变量进行编码 :param value: :return: """ # 布尔类型 if isinstance(value, bool): return self._encode_bool(value) # 整型(包括长整型) elif isinstance(value, int): return self._encode_int(value) # 浮点类型 elif isinstance(value, float): return self._encode_float(value) # 字符串类型 elif isinstance(value, str): return self._encode_str(value) # 对象类型 elif isinstance(value, Object): return self._encode_object(value) # 列表(list)类型,不可以使用tuple替代 elif isinstance(value, list): return self._encode_list(value) # null elif value is None: return [ord('N')] else: raise HessianTypeError('Unknown argument type: {}'.format(value))
def read_null(self): """ 读取一个None :return: """ value = self.read_byte() if value == ord('N'): return None else: raise HessianTypeError('{0} is not null'.format(value))
def read_boolean(self): """ 读取一个布尔类型 :return: """ value = self.read_byte() if value == ord('T'): return True elif value == ord('F'): return False else: raise HessianTypeError('illegal boolean value: {0}'.format(value))
def read_type(self): """ type代表了list或者map中泛型的类型,在Python中此类型无意义 :return: """ _type = self.read_next() if isinstance(_type, int): return self.types[_type] elif isinstance(_type, str): self.types.append(_type) return _type else: raise HessianTypeError( 'Unknown _type type for value: {0}'.format(_type))
def read_date(self): """ 读取一个date类型的值 :return: """ value = self.read_byte() if value == 0x4a: timestamp = unpack('!q', self.read_bytes(8))[0] elif value == 0x4b: timestamp = unpack('!i', self.read_bytes(4))[0] timestamp *= 60000 else: raise HessianTypeError('{0} is not date type'.format(value)) return datetime.fromtimestamp( timestamp / 1e3).strftime("%Y-%m-%dT%H:%M:%S.%f+0800")
def read_map(self): """ 读取一个dict :return: """ value = self.read_byte() if value == ord('M') or value == ord('H'): result = {} self.objects.append(result) while self.get_byte() != ord('Z'): key = self.read_next() value = self.read_next() result[key] = value self.read_byte() # 干掉最后一个'Z'字符 return result else: raise HessianTypeError('{0} is not a map.'.format(value))
def read_double(self): """ 读取一个浮点类型 :return: """ value = self.read_byte() if value == 0x5b: result = 0.0 elif value == 0x5c: result = 1.0 elif value == 0x5d: result = float(unpack('!b', self.read_bytes(1))[0]) elif value == 0x5e: result = float(unpack('!h', self.read_bytes(2))[0]) elif value == 0x5f: result = float(unpack('!i', self.read_bytes(4))[0]) * 0.001 elif value == ord('D'): result = float(unpack('!d', self.read_bytes(8))[0]) else: raise HessianTypeError('{0} is not a float'.format(value)) return result
def read_long(self): """ 读取一个long类型的数字 :return: """ value = self.read_byte() if 0xd8 <= value <= 0xef: result = value - 0xe0 elif 0xf0 <= value <= 0xff: result = ((value - 0xf8) << 8) | self.read_byte() elif 0x38 <= value <= 0x3f: i = (value - 0x3c) << 16 i |= self.read_byte() << 8 i |= self.read_byte() result = i elif value == 0x59: result = unpack('!i', self.read_bytes(4))[0] elif value == ord('L'): result = unpack('!q', self.read_bytes(8))[0] else: raise HessianTypeError('{0} is not long type'.format(value)) return result