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 运行协议不定义请求消息类型或回应消息类型
...
继续阅读
(92)