除原始基础类型外,Protobuf消息能否将序列化对象/消息作为字段类型?
Protobuf自定义消息字段类型相关问题解答
可以实现该需求,且提供两种官方支持的标准方案,不属于非规范的自定义用法
- 首先明确基础逻辑:Protobuf的嵌套消息字段,本质就是将对应类型的序列化二进制内容直接作为字段值完成存储、序列化和传输,本身不存在“自定义消息不能承载其他序列化结果”的限制
- 若需求为不提前在.proto文件中声明嵌套消息的固定结构,直接将任意已完成序列化的对象/消息作为字段嵌入,可通过两种官方支持的路径实现:
- 路径1:使用内置
bytes类型承载序列化内容
直接在自定义消息中定义字段:bytes raw_serialized_content = 1;
Protobuf不会对该字段的二进制内容做结构校验,可接收任意格式的序列化结果。需要业务层自行维护内容对应的消息类型、编解码逻辑,保证序列化和反序列化阶段的类型匹配 - 路径2:使用官方内置的
Any通用消息包装类型
先在.proto文件中导入google/protobuf/any.proto,之后直接定义字段:google.protobuf.Any packed_message = 2;
该类型内部天然存储两部分内容:嵌入消息的序列化二进制值、原消息的类型唯一标识。Protobuf框架会自动完成嵌入内容的类型校验,反序列化阶段可直接通过框架提供的Unpack方法,将字段内容还原为对应的强类型消息,无需业务侧手动维护类型映射
- 路径1:使用内置
- 补充说明:如果需要承载非Protobuf框架生成的序列化对象(比如其他序列化协议输出的二进制、JSON字符串等),同样可通过
bytes类型做字段承载,只是这类场景下Protobuf不会自动完成对应内容的编解码,需要业务层手动做格式转换
内容的提问来源于stack exchange,提问作者Dirac
相关产品推荐
相关产品推荐

