摘要:语法分析 和通常的有语法的结构一样,proto的编译也经过词法(tokenize)和语法(parse)两个阶段,相关代码分别在tokenizer.cc和parser.cc两个文件中。 /// @file: protobuf\src\google\protobuf\compiler\parser.cc
阅读全文
摘要:一、问题 统计下protobuf中对消息调用DebugString输入bytes数量。 二、C++对于字符串的规定及gcc的解析 1、C++标准对于字符串常量的规定 这个地方是增加了字符常量的语法类型,其中比较特殊的是R"delimiter(raw_characters)delimiter" 这种语
阅读全文
摘要:一、为什么使用varint编码 在常规的TLV(TAG Length Value)编码格式中,我们注意到其中有一个必然存在的Length字段。这个就是管理的成本,也就是为了实现管理,管理结构本身也会带来消耗。对int这种最为常见的类型来说,通常现实生活中的自然数范围都比较小,所以定长的4个字节表示1
阅读全文
摘要:一、为什么需要extension Protobuf的文档明确说明了禁止继承protobuf的消息,而且在生成的C++消息中也添加了final来从语法上完全禁止继承这些消息。protobuf把这些说明放在序列化和反序列化这个条目下,可能主要是基于序列化/反序列化的处理。但是在某些情况下,如果我们一定要
阅读全文
摘要:一、Message消息的可视化展示 将消息转换为二进制结构,必然提高了结构的传输效率。但是和通常的二进制文件格式一样,为节省空间付出的代价就是牺牲了部分的可读性,就像linus对systemd中二进制文件的看法一样“I dislike the binary logs, for example”。转换
阅读全文
摘要:零、更新 proto3中用法参考这个。 一、extension的用法 由于extension是protobuf2中一个比较高级,但是在proto3中禁用的功能,所以在这里还是看下这个内容的实现,完整的实现参考来自下面文章。为了避免跳转或者连接失效,这里把原文章内容拷贝一份: proto文件packa
阅读全文
摘要:一、一个message的meta中包含的内容 所谓反射(reflection),最直观的理解就是可以在运行中通过一个字符串的名称获得一个内存地址。在protobuf中,这一点通过Reflection对象完成,尽管这个类的接口 virtual int32 GetInt32 (const Message
阅读全文
摘要:一、protobuf简介 万能的google可以找到这个关于protobuf的简介,从实现说明上来看,并没有特别值得说明的地方。对于一个协议或者存储来说,最为关心的其实是协议或存储的兼容性问题,其它的int变长编码并没有什么特殊的,因为在这之前,utf-8之类的变长编码也同样使用类似的方法来进行编解
阅读全文