示例#1
0
 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))
示例#2
0
 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
示例#3
0
 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))
示例#4
0
 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))
示例#5
0
 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))
示例#6
0
 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))
示例#7
0
 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")
示例#8
0
    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))
示例#9
0
 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
示例#10
0
 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