本文主要介绍proto的message序列化函数实现,并以RedisRequest为例介绍brpc中序列化函数实现。
1.SerializeToString是Message父类MessageLite的函数,它会调用SerializeWithCachedSizes
不同协议的序列化方式可能不同。
(1)对于proto而言,SerializeWithCachedSizes没有在子类单独定义,调用的是MessageLite的SerializeWithCachedSizes
MessageLite的SerializeWithCachedSizes会调用每一个具体的proto子类的_InternalSerialize函数,比如这个Impression proto
(2)另外,例如对于Message子类Brpc::RedisRequest而言,SerializeWithCachedSizes有单独定义,且实现上只打了日志,没有对指针赋值,没有做任何处理,日志也说了不支持。
2.SerializeTo是Brpc::RedisRequest单独提供的函数,实现上是拷贝的io_buf,它是Brpc::RedisRequest自己存放redis协议的序列化结果的结构。
参考:
https://protobuf.dev/reference/cpp/api-docs/google.protobuf.message_lite/
brpc源码