5.3 类型映射
正确处理类型是数据库,服务器,客户端,正常工作的关键
-
简单类型
Xml描述 Java C# C++ Javascript Lua boolean boolean bool bool Boolean Boolean byte byte byte int8_t Number Number short short short int16_t Number Number int int int int32_t Number Number long long long int64_t Number Number float float float float Number Number double double double double Number Number string string string std::string String String binary Octets Octets Octets Array(Number) Table(Number) any:[type] type 不支持 不支持 不支持 不支持 除了c#的byte为无符号类型之外,其它的所有数值类型均为有符号类型,可能导致处理上的差异,需要特别小心。
使用脚本客户端的情况下需要小心使用long类型, 脚本客户端的Number在内部表示为double, long的精度达不到64位,根据IEEE754标准, javascript能提供52位有效位, 不知道为什么Lua5.1更少, 基于这样的现实考虑, 在脚本数据编码时作了一个特殊处理, 绝对值小于等于0x3FFFFFFFFFFFL的long按照数值编码, 否则编码为串, 解码之后至少能确保表达的一致性。
服务器的字符串均以UTF8格式编码,客户端在必要情况下需要自己转换。没有编码解码库的情况下,可以考虑使用binary替换,自己解释。
any类型,不能直接或间接地被任何bean,protocol,rpc,view引用。
-
容器类型
Xml描述 Java C# C++ Javascript Lua List LinkedList LinkedList std::list Array Table Vector ArrayList List std::vector Array Table Set HashSet HashSet std::unordered_set Array Table Map HashMap Dictionary std::unordered_map Map Table 类型化语言中所有容器均使用泛型类型。
Javascript规范本身不包含Map,各种浏览器上的javascript环境都有各自的实现版本;OracleJDK自带的javascript引擎实现不包含Map,使用limax内置的简单实现——map.js。
-
构造类型
XML description Java C# C++ Javascript Lua Bean Class Class class Map Table Cbean Class Class class Map Table Xbean Class Class class Map Table 类型化语言中各种bean都定义成类,另外protocol,rpc,view,control,引用部分xbean字段的bind,均生成类代码。
允许的引用关系的粗略描述(直接或者通过容器间接引用):
bean := bean* | cbean* | xbean*
bean不允许最终引用到Any类型上。
cbean := cbean* xbean := cbean* | xbean*
脚本语言中,没有类的概念,运行过程中,对象数据直接生成到以字段名为key的关联容器中。