通过Reflection来操作FieldDescriptor,从而动态获取或修改单个字段 获取 Descript、Reflection 的函数: const google::protobuf::Reflection...->GetDescriptor(); 获取 FieldDescriptor 的函数: const google::protobuf::FieldDescriptor * pFieldDesc = pDescriptor...类 FieldDescriptor 中还有一个支持扩展的函数,函数如下: // Get the FieldOptions for this field. .../protobuf/descriptor.h> #include std::string strRegex = FieldDescriptor-...对于某些运营系统来说,其希望能够快速接入一些数据,传统开发常常会面临如下问题: 如何在不增加或变更表结构的基础上,如何快速接入数据? 如何零开发实现频繁添加字段、新增渠道等需求?
Protocol Buffers是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。它不依赖于语言和平台并且可扩展性极强。...现阶段官方支持C++、JAVA、Python等编程语言,但可以找到大量的几乎涵盖所有语言的第三方拓展包。 Protocol Buffers经常被简称为protobuf。 ?...(图文无关,就是想纪念一下消失的巴黎圣母院) 项目GitHub地址: https://github.com/google/protobuf 为什么要使用protobuf?...(高效) 3、它可以将数据序列化为XML,可以与不同种类的项目进行共享数据,一般的在软硬件交互,游戏开发等情况下使用。(应用广泛) 如何使用protocolbuf?...所以,之后想要使用protobuf,就可以在proto文件中创建类似python字典形式的数据,之后再使用: protoc --python_out=输出路径 proto文件路径即可 这就是protobuf
需求 项目中有这样一个需求,根据一个类别名以及其对应的类型,创建对应的数据结构。需求很简单吧。。。 优化前的版本,先创建一个配置,然后程序启动的时候,加载跟配置,然后根据配置内容进行相应的操作。...方案二: reflection 其实,这种需求从概念上讲,应该是reflection,中文称为反射,众所周知C++标准委员会那帮人不食人间烟火,也一直没有将反射纳入标准。...:protobuf::Descriptor* desc = category.GetDescriptor(); std::vector vfd; for (int i = 0; i field_count(); ++i) { const google::protobuf::FieldDescriptor...:make_shared(); break; } case google::protobuf::FieldDescriptor::CPPTYPE_UINT32
《IM通讯协议专题学习(六):手把手教你如何在Android上从零使用Protobuf》(稍后发布..)...《IM通讯协议专题学习(七):手把手教你如何在NodeJS中从零使用Protobuf》《IM通讯协议专题学习(八):金蝶随手记团队的Protobuf应用实践(原理篇)》(* 本文)《IM通讯协议专题学习...陈硕的文章《一种自动反射消息类型的 Google Protobuf 网络传输方案》中对 GPB 的反射机制做了详细的分析和源码解读。...protobuf Message types;2)MessageFactory 能创建程序编译的时候所链接的全部 protobuf Message types。...[5] 如何选择即时通讯应用的数据传输格式[7] 强列建议将Protobuf作为你的即时通讯应用数据传输格式[8] APP与后台通信数据格式的演进:从文本协议到二进制协议[9] 面试必考,史上最通俗大小端字节序详解
emmm,算是吧,但是也不全是,先给大家说下protobuf吧。 protobuf:谷歌公司出的一款开源项目,性能好,效率高,并且支持多种语言,例如:java,C++,python等。 ...二、protobuf详解 在使用protobuf之前,需要安装protobuf编译器和运行时环境。 由于protobuf是跨平台,跨语言的,所以需要下载和安装对应版本的编译器和运行时依赖。...-- protobuf-谷歌 --> com.google.protobuf protobuf-java.../protobuf/releases 选择对应系统的版本,下载后解压。...在实际操作中存在的问题 protobuf主要用于与前端通信编解码,那么在后台收到二进制如何存入到数据库中呢,或者说从数据库中取得的数据怎么映射到protobean呢。
kryo就是一款快速、高效的序列化框架,但是它不是我们今天的主角,因为他只能在java中使用,和前端非java语言的通讯就存在极大的隔阂。我们今天的主角是protobuf?...emmm,算是吧,但是也不全是,先给大家说下protobuf吧。 protobuf:谷歌公司出的一款开源项目,性能好,效率高,并且支持多种语言,例如:java,C++,python等。 ...二、protobuf详解 在使用protobuf之前,需要安装protobuf编译器和运行时环境。 由于protobuf是跨平台,跨语言的,所以需要下载和安装对应版本的编译器和运行时依赖。...-- protobuf-谷歌 --> com.google.protobuf protobuf-java...在实际操作中存在的问题 protobuf主要用于与前端通信编解码,那么在后台收到二进制如何存入到数据库中呢,或者说从数据库中取得的数据怎么映射到protobean呢。
本篇主要介绍如何在Python语言中使用Google Protocol Buffer(后续都简写为PB), 包括以下几个部分: 为什么要使用PB?...,安装方法如下: 下载最新的protobuf release包安装即可,当前版本为3.5.1,安装步骤如下 wget https://github.com/google/protobuf/releases...proto 文件非常类似 java 或者 C++ 语言的数据定义。...import descriptor as _descriptor from google.protobuf import message as _message from google.protobuf...我们用“复杂”这个词,不仅仅是指从个数上说有更多的 fields 或者更多类型的 fields,而是指更加复杂的数据结构: Message嵌套 Import Message 下面分别介绍 Message
C++:编译器从每个.proto生成.h和.cc文件,并为文件中描述的每个消息类型分配一个类。...如果您认为您需要创建自己的options,请参阅“Proto2语言指南”了解详细信息。 请注意,创建自定义options使用的扩展名只能在proto3中的自定义options中使用。...import "google/protobuf/descriptor.proto"; extend google.protobuf.MessageOptions { optional string...从它读取自定义选项就像阅读任何其他扩展名。...这是一个使用各种选项的例子: import "google/protobuf/descriptor.proto"; extend google.protobuf.FileOptions { optional
可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。...Total Time 指一个对象操作的整个时间,包括创建对象,将对象序列化为内存中的字节序列,然后再反序列化的整个过程。...从测试结果可以看到 Protobuf 的成绩很好,感兴趣的读者可以自行到网站 http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking...编写新的 proto 编译器 随 Google Protocol Buffer 源代码一起发布的编译器 protoc 支持 3 种编程语言:C++,java 和 Python。...大于 128 的数字,比如 300,会用两个字节来表示:1010 1100 0000 0010 下图演示了 Google Protocol Buffer 如何解析两个 bytes。
但是因为官方库缺少将proto转化成kotlin class的能力,所以我们一开始并没有直接选用它。只能去从github搜索下有没有别的更好支持的库。...pbandk pbandk 仓库地址 这个库通过protobuf-java编写了一个proto插件。...comments are removed and java/csharp options removed syntax = "proto3"; package tutorial; import "google...string number = 1; PhoneType type = 2; } repeated PhoneNumber phones = 4; google.protobuf.Timestamp...phones: List = emptyList(), @ProtoNumber(5) val lastUpdated: com.google.protobuf.KTimestamp
ProtoBuf 是一套接口描述语言(IDL)和相关工具集(主要是 protoc,基于 C++ 实现),类似 Apache 的 Thrift)。...用户写好 .proto 描述文件,之后使用 protoc 可以很容易编译成众多计算机语言(C++、Java、Python、C#、Golang 等)的接口代码。...protocol buffer的预留了19000~19999(FieldDescriptor::kFirstReservedNumber ~ FieldDescriptor::kLastReservedNumber...需要注意的是,客户端解码message时可能会给出不同的解释,如未识别的proto3 enum类型会保存在message中,但如何解释则依赖于解码的语言。...oneof oneof类似C语言的联合体union,oneof中不能使用repeated option 所有有效的选项都定义在google/protobuf/descriptor.proto,参见
最小的标识号可以从1开始,最大到2^29 - 1, or 536,870,911。不可以使用其中的[19000-19999]的标识号, Protobuf协议实现中对这些进行了预留。...例如,下面是如何在C++中设置bar的值: Foo foo; foo.SetExtension(bar, 15); 类似地,Foo类也定义了模板函数 HasExtension(),ClearExtension...C++中的代码 如下所示: using google::protobuf; protobuf::RpcChannel* channel; protobuf::RpcController* controller...该功能应该属于一个高级特性,对于大部分人是用不到的。由于options是定在 google/protobuf/descriptor.proto中的,因此你可以在该文件中进行扩展,定义自己的选项。...可以通过protobuf-global-extension-registry@google.com来获取全局唯一标识号。只需提供你的项目名和项目网站. 通常你只需要一个扩展号。
其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。...clone() { return super.clone(); } @Override public Builder setField( com.google.protobuf.Descriptors.FieldDescriptor...return super.setField(field, value); } @Override public Builder clearField( com.google.protobuf.Descriptors.FieldDescriptor...return super.clearOneof(oneof); } @Override public Builder setRepeatedField( com.google.protobuf.Descriptors.FieldDescriptor...clone() { return super.clone(); } @Override public Builder setField( com.google.protobuf.Descriptors.FieldDescriptor
NioEventLoop 内部采用串行化设计,从消息的读取->解码->处理->编码->发送,始终由 IO 线程 NioEventLoop 负责。...这使得链式操作简单、高效, 并有利于编写可重用的、通用的代码。Netty 框架的目标就是让你的业务逻辑从网络基础应用编码中分离出来、解脱出来。...Google 的 的 Protobuf Protobuf 是 Google 发布的开源项目,全称 Google Protocol Buffers,特点如下: 支持跨平台、多语言(支持目前绝大多数语言,...例如 C++、C#、Java、python 等) 高性能,高可靠性 使用 protobuf 编译器能自动生成代码,Protobuf 是将类的定义使用.proto 文件进行描述, 然后通过 protoc.exe...(field, index, value); } @Override public Builder addRepeatedField( com.google.protobuf.Descriptors.FieldDescriptor
接着我用command + K让它帮我生成一个demo代码:C++ protobuf中通过反射获取一个enum类型的数字值和字符串名// Assume we have a protobuf message...called "my_message"const google::protobuf::Descriptor* descriptor = my_message.GetDescriptor();const...the enum fieldconst google::protobuf::FieldDescriptor* field = descriptor->FindFieldByName("my_enum_field...");// Get the enum value using reflectionif (field->type() == google::protobuf::FieldDescriptor::TYPE_ENUM...有趣的是这两家都已谁能搜索到文章多为荣,甚至google这个单词都是是这个含义,google源自googol,即10的100次幂,表示数量极大,即google能搜到到的文章量巨大。
只需使用 Protobuf 对数据结构进行一次描述,即可利用各种不同语言或从各种不同数据流中对你的结构化数据轻松读写。 Protocol buffers 很适合做数据存储或 RPC 数据交换格式。...可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式 二. 为什么要发明 protocol buffers ? ?...proto2 和 proto3 的名字看起来有点扑朔迷离,那是因为当我们最初开源的 protocol buffers 时,它实际上是 Google 的第二个版本了,所以被称为 proto2,这也是我们的开源版本号从...另外在反序列化的过程中,无法被识别的枚举值,将会被保留在 messaage 中。因为消息反序列化时如何表示是依赖于语言的。...同样,由新代码创建的消息可以由旧代码解析:旧的二进制文件在解析时会简单地忽略新字段。(具体原因见 未知字段 这一章节) 3.只要字段号在更新的消息类型中不再使用,字段可以被删除。
由于 Google出品,我相信Protocol Buffer已经具备足够的吸引力 今天,我将详细介绍Protocol Buffer 的语法 & 如何去构建Protocol Buffer 的消息模型...buffer 的类型名称解析与 C++ 一致:从 最内部 开始查找,依次 向外 进行 每个包会被看作是其父类包的内部类 Protocol buffer 编译器会解析 .proto文件中定义的所有类型名...: 对 Java 或 C++来说,将有一个对应的 enum 文件 对 Python 来说,有一个特殊的EnumDescriptor 类 被用来在运行时生成的类中创建一系列的整型值符号常量(symbolic...,否则会导致数据不一致;可以通过为新项目定义一个可扩展标识号规则来防止该情况的发生 } 要访问 扩展字段 的方法与 访问普通的字段 不同:使用专门的扩展访问函数 实例: // 如何在C++中设置 bar...总结 看完本文,你应该非常了解Protocol Buffer 的语法 & 如何去构建Protocol Buffer 的消息模型 关于Protocol Buffer 的系类文章如下: 快来看看Google
由于 Google出品,我相信Protocol Buffer已经具备足够的吸引力 今天,我将详细介绍Protocol Buffer 的语法 & 如何去构建Protocol Buffer 的消息模型 Carson...带你学序列化Protocol Buffer系列文章 快来看看Google出品的Protocol Buffer,别只会用Json和XML了 Carson带你学序列化:手把手教你如何安装Protocol...: Protocol buffer 的类型名称解析与 C++ 一致:从 最内部 开始查找,依次 向外 进行 每个包会被看作是其父类包的内部类 Protocol buffer 编译器会解析...对 Java 或 C++来说,将有一个对应的 enum 文件 对 Python 来说,有一个特殊的EnumDescriptor 类 被用来在运行时生成的类中创建一系列的整型值符号常量(symbolic...,否则会导致数据不一致;可以通过为新项目定义一个可扩展标识号规则来防止该情况的发生 } 要访问 扩展字段 的方法与 访问普通的字段 不同:使用专门的扩展访问函数 实例: // 如何在C++中设置 bar
于是我们自己写了 protoc 插件去给生成的C++代码插入对 fmt.dev 的支持。...::protobuf::FieldDescriptor* field) { std::string result = field->lowercase_name(); if...所以为了简单起见我们第一步是把pb读进来以后创建出第一个符号库集合,然后把它和官方和我们工具自带的符号库整合,再执行一次构建符号库。这样第二次构建的时候就可以直接使用在同一个pb文件里的插件数据了。...所以后来我优化了下流程,允许代码生成工具去从 YAML 里读取多个服务的多个生成规则。整个流程里增加了一步,提供了接口把多种类型的服务的声明整合到一个YAML配置文件里。...) {}; } 上面的 option 里的部分其实就是针对特定类型服务的接入层的自定义扩展机制。
领取专属 10元无门槛券
手把手带您无忧上云