protoc-gen-lua序列化pb的一个问题

最近开始使用阿里云的日志服务来上传客户端的日志。需要发送pb格式日志压缩数据。客户端使用lua脚本,pb模块使用protoc-gen-lua。

在测试写入接口的时候,有时候返回成功,有时候返回"fail to parse protobuf"。

查了一下发现protoc-gen-lua的序列化的结果是不稳定的。

protobuf.lua中_internal_serialize函数实现,ListFields方法遍历是无序的,会导致结果不稳定,阿里云平台无法反序列化。

local _internal_serialize = function(self, write_bytes)
    for field_descriptor, field_value in message_meta._member.ListFields(self) do
        field_descriptor._encoder(write_bytes, field_value)
    end
end

改动:根据field的key的index排序,再进行遍历。这样输出的结果是稳定的。

local _internal_serialize = function(self, write_bytes)
    local field_list = {}
    for k, v in pairs(self._fields) do
        field_list[k.index + 1] = k
    end
    local n = table.maxn(field_list)
    for i = 1, n do
        local descriptor = field_list[i]
        if descriptor then
            value = self._fields[descriptor]
            if _IsPresent(descriptor, value) then
                descriptor._encoder(write_bytes, value)
            end
        end
    end
end

转载于:https://my.oschina.net/zhudusong/blog/1571555

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值