Protobuf枚举类型异常:赋值后解码始终显示首个枚举值
解决Protobuf枚举类型在PBC库中始终显示默认值的问题
问题根源
不管是Lua还是C语言代码,核心问题都是枚举值的赋值未被正确识别,导致Protobuf自动使用了枚举的默认值(即第一个定义的SendType_None = 0):
- Lua中PBC库不会自动导出枚举常量为全局变量,
SendType_Tag属于未定义变量,实际赋值为nil,触发默认值填充。 - C语言中大概率是引用枚举常量时的命名错误,比如未使用Protobuf生成代码时的标准前缀。
Lua代码修复方案
直接使用枚举对应的数值,或手动创建枚举映射表来保证可读性:
方案1:直接使用枚举数值
把SendType_Tag替换为对应的数值4:
local msgbase = { protoName = "msgDemo1", sendType = 4, -- SendType_Tag对应的枚举值 roomID = 7777, }
方案2:手动定义枚举映射表
提前定义枚举常量映射,保留代码可读性:
-- 定义枚举常量映射 local SendType = { SendType_None = 0, SendType_ALL = 1, SendType_Self = 2, SendType_Other = 3, SendType_Tag = 4, SendType_Specific = 5, } local msgbase = { protoName = "msgDemo1", sendType = SendType.SendType_Tag, roomID = 7777, }
C语言代码修复方案
Protobuf生成C代码时,会给枚举值加上枚举名作为前缀,比如你的SendType枚举,生成的常量名是SendType_SendType_Tag(而非直接SendType_Tag):
- 确保包含生成的头文件(如
net.pb.h)。 - 使用正确的枚举常量名赋值:
msgBase msg; msg.has_protoName = 1; strcpy(msg.protoName, "msgDemo1"); msg.has_sendType = 1; msg.sendType = SendType_SendType_Tag; // 使用生成代码中的正确常量名 msg.has_roomID = 1; msg.roomID = 7777;
验证方式
修改后重新执行编码、解码流程,sendType会正确显示为SendType_Tag(Lua中显示数值4,C语言中显示对应枚举值)。
内容的提问来源于stack exchange,提问作者YueYuHai
相关产品推荐
相关产品推荐

