Protobuf与lua服务端

本文介绍了Google的ProtocolBuffer(PB)作为数据交换格式的特性,强调其在二进制传输、效率和兼容性方面的优势。在游戏服务端与客户端交互中,作者发现 Protobuf 的 `repeated` 字段可用于实现类似数组的功能,解决了构造链表数据的不便。在Lua服务端,文章详细讲述了如何构造数据并进行编码,通过一个实例说明了一个小错误可能导致的编码问题,提醒读者注意协议设计的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

  之前一直不知道protobuf还有类似数组的这种数据类型,在游戏服务端和客户端交互时总是人为的去构造一直数据类型来解析传递到客户端的链表数据。总觉得很不方便,今天再次看了下官方文档,发现repeated字段便能实现类似数组的功能,这令我大为欣喜。主要之前为了求快,不断满足公司demo的功能,没有仔细看协议变依葫芦画瓢开始开发了,果然这样子有点费力不讨好。
  由于游戏的服务端采用的是Lua来写逻辑,这里就记录下如何用lua来构造数据并编码的。

syntax = "proto2";
package test;
import "empty_msg.proto";
// 功能测试
service Test {
    rpc TestArray(rpc.EmptyMsg) returns (ArrayTestData);
}
message TestModel
{
    optional int32 id = 1;
    optional int32 value = 2;
}
message ArrayTestData{
    repeated TestModel testModel = 1;
}

对应的Lua脚本

local resTable = {}
local resp = {id = 11,value = 6}
local resp1 = {id = 12,value = 7}
table.insert(resTable,resp)
table.insert(resTable,resp1)
local arrayTestData = {testModel = resTable}
c_rpc.reply_to(ctx, pb.encode("test.ArrayTestData", arrayTestData))

  其实是很简单的东西,但是由于一个小问题,导致我花了一下午才捣鼓出来,所以就贴出来,防止自己下次再犯错。之前在lua脚本里面我是这么写的local arrayTestData = {resTable} ,因为参见上面protobuf的协议设计,直观的认为test.ArrayTestData仅仅是一个存放test.TestModel数据类型的一个数组而已。其实逻辑就错在了这里,是test.ArrayTestData里面的一个数据成员testModel这个对象才是存放数组的,所有必须要使用testModel = resTable,否则会编码出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值