基于::google::protobuf::MessageLite的Wire Data能否被::google::protobuf::Message序列化?
问题解答:MessageLite生成的Wire Data能否被Message类序列化?
问题:如果基于
::google::protobuf::MessageLite运行时生成了Wire Data,且双方使用相同的message定义,那么这份Wire Data能否被::google::protobuf::Message(MessageLite的派生类)序列化?
可以,完全没问题,核心原因和细节如下:
- Wire Data格式与实现类无关:Protobuf的Wire Data是遵循官方规范的二进制格式,仅由message的schema(字段编号、类型、重复规则等)决定,和生成它的是MessageLite还是Message类没有关联。只要双方使用的schema完全一致,Wire Data就可以互相兼容解析。
- Message是MessageLite的扩展派生类:
::google::protobuf::Message继承自MessageLite,它在后者基础上增加了反射、描述符访问等高级功能,但核心的序列化/反序列化逻辑完全复用MessageLite的实现,因此Message类完全理解MessageLite生成的Wire Data格式。 - 实际操作无阻碍:代码层面可以直接调用Message类的
ParseFromArray、ParseFromString等解析方法,处理由MessageLite生成的Wire Data;反过来,Message生成的Wire Data也能被MessageLite正常解析。
需要注意:如果双方的message定义不一致(比如字段编号修改、类型变更、新增/删除字段未遵循兼容规则),不管用MessageLite还是Message都会出现解析问题,但这属于schema不兼容的范畴,和两个类的继承关系无关。
内容的提问来源于stack exchange,提问作者Swift - Friday Pie
相关产品推荐
相关产品推荐

