sproto 的缺省值处理
sproto 由于主要供 lua 使用,是不能在协议定义中描述缺省值的。所有不编码的字段都呈现为 lua 中的 nil 。
注:这里还有个实现上的小问题。如果一个数组为空,也会呈现为 nil 而不是空表,所以应当注意处理。
我最近给 sproto 增加了一个新的 api ,可以为一类消息生成一个全部为缺省值的 table 。这样,使用者就可以方便把这个 table 作为别的 table 的 metatable 中的 index 方法了。相当于实现了原来在 protobuf 中的缺省值的特性。
只不过,缺省值不能主动定义。所有的 integer 缺省为 0 、boolean 缺省为 false 、string 缺省为空串、子类型为空表,并附加有一项 __type
为子类型的名字。无数据的数组也缺省为一个空表。
使用方法为:
sproto:default( typename )
给出消息类型名,就可以返回一个全部填有缺省项的表。你也可以用它来取得一类消息中有哪些项。
这个 api 也可以用来取协议对应的消息类型,用法是
sproto:default(protoname, "REQUEST" 或 "RESPONSE")
第二个参数必须为 "REQUEST" 用来取对应协议的请求类型;或是 "RESPONSE" 来取对应协议的回应消息。
如果对应消息并不存在(sproto 运行协议不定义请求消息类型或回应消息类型),返回空,否则返回填充有默认值的 table 。
实际使用时,还需要利用这个 api 做一定的封装。之所以没有像 pbc 的 lua binding 那样将 default 值的 metatable 设置好,是不想把库搞的太复杂,把这些设置的权利留给 RPC 框架开发者。
Comments
Posted by: 孟思明 | (1) March 8, 2018 11:26 AM