Proto3使用指南】的更多相关文章

Generating Your Classes - 生成类 要生成Java.Python.C++.Go.Ruby.ObjuleC或C代码,需要使用.proto文件中定义的消息类型,还需要在.proto上运行协议缓冲区编译器protoc.如果尚未安装编译器,请下载该软件包并按照自述文件中的说明进行操作.对于Go,您还需要为编译器安装一个特殊的代码生成器插件:您可以在GitHub上的golang/protobuf存储库中找到这个插件和安装说明. 协议编译器的调用方式如下: protoc --prot…
前言 近日在学习gRPC框架的相关知识时接触到Protobuf(protocol-buffers,协议缓冲区),proto3等知识.网上很多文章/帖子经常把gRPC与proto3放在一起,为避免初学者产生混淆,这里先简单介绍一下gRPC.Protobuf.proto3三者以及他们之间的关系: gRPC:一个高性能.开源的通用RPC框架,它可以使用Protobuf定义服务 Protobuf:协议缓冲区是一种与语言无关.与平台无关的可扩展机制,用于序列化结构化的数据(参考JSON) proto3:p…
本文是对官方文档的翻译,大部分内容都是引用其他一些作者的优质翻译使文章内容更加通俗易懂(自己是直译,读起来有点绕口难理解,本人英文水平有限),参考的文章链接在文章末尾 这篇指南描述如何使用protocol buffer语言来组织你的protocol buffer数据,包括.proto文件的语法规则以及如何通过.proto文件来生成数据访问类代码. Defining A Message Type(定义一个消息类型) syntax = "proto3"; message SearchReq…
这篇指南讲述如何使用Protocol Buffers来结构化你的Protocol Buffer数据,包括.proto文件语法以及如何从.proto文件生成你的访问类型.本文主要涵盖了proto3的语法,proto2的语法参见Proto2 Language Guide. 这是一篇参考教程 -- 本文中诸多功能的分步示例,详见tutorial. 目录 定义消息类型 标量类型 默认值 枚举 使用其他消息类型 嵌套类型 更新消息类型 未知字段 Any Oneof Maps 包 定义服务 Json Map…
Options - 选项 .proto文件中的单个声明可以使用许多 选项 进行注释.选项不会更改声明的总体含义,但可能会影响在特定上下文中处理声明的方式.可用选项的完整列表在google/protobuf/descriptor.proto中定义. 有些选项是文件级选项,这意味着它们应该写在顶级作用域中,而不是写在任何消息.枚举或服务定义中.有些选项是消息级别的选项,这意味着它们应该写在消息定义中.有些选项是字段级选项,这意味着它们应该写在字段定义中.也可以在枚举类型.枚举值.字段之一.服务类型和…
JSON Mapping - JSON映射 Proto3支持JSON中的规范编码,使得在系统之间共享数据更加容易.下表按类型对编码进行了描述. 如果JSON编码的数据中缺少一个值或者它的值为null,那么在解析到协议缓冲区时,它将被解释为适当的默认值.如果某个字段在协议缓冲区中有默认值,则在JSON编码的数据中默认会省略该字段以节省空间.一个实现可以提供在JSON编码的输出中使用默认值发出字段的选项. proto3 JSON JSON example 描述[译] message object {…
Defining Services - 定义服务 如果要在RPC(Remote Procedure Call,远程过程调用)系统中使用消息类型,可以在.proto文件中定义RPC服务接口,协议缓冲区编译器将根据所选语言生成服务接口代码和存根.因此,例如,如果您想用一个方法定义一个RPC服务,该方法接受您的SearchRequest并返回一个SearchResponse,您可以在.proto文件中这样定义它: service SearchService { rpc Search(SearchReq…
Maps - 映射 如果要创建关联映射作为数据定义的一部分,协议缓冲区提供了一种方便的快捷语法: map<key_type, value_type> map_field = N; -其中key_type可以是任何整型或字符串类型(因此,除了浮点类型和字节之外的任何标量类型).注意enum不是一个有效的key_type.value_type可以是除其他map以外的任何类型. 因此,例如,如果您想创建一个项目映射,其中每个Project消息都与一个字符串键相关联,您可以这样定义它: map<…
未知字段和任意类型篇幅较少,因此将他们合并到本文进行描述. Unknown Fields - 未知字段 未知字段是格式良好的协议缓冲区序列化数据,表示解析器无法识别的字段.例如,当一个旧二进制代码解析一个带有新字段的新二进制代码发送的数据时,这些新字段在旧二进制代码中成为未知字段. 最初,proto3消息在解析过程中总是丢弃未知字段,但在3.5版中,我们重新引入了未知字段的保留,以匹配proto2的行为.在版本3.5和更高版本中,解析期间保留未知字段,并将其包含在序列化输出中. Any - 任意…
Updating A Message Type - 更新消息类型 如果现有的消息类型不再满足您的所有需要(例如,您希望消息格式有一个额外的字段),但是您仍然希望使用用旧格式创建的代码,不要担心!在不破坏任何现有代码的情况下更新消息类型非常简单.记住以下规则: 不要更改任何现有字段的字段编号. 如果添加新字段,则使用"旧"消息格式的代码序列化的任何消息仍然可以由新生成的代码进行解析.您应该记住这些元素的默认值,以便新代码可以正确地与旧代码生成的消息交互.类似地,由新代码创建的消息也可以由…
Using Other Message Types - 使用其他消息类型 可以将其他消息类型用作字段类型.例如,假设您希望在每个SearchResponse消息中包含Result消息--为此,您可以在同一.proto中定义Result消息类型,然后在SearchResponse中指定类型为Result的字段: message SearchResponse { repeated Result results = 1; } message Result { string url = 1; strin…
枚举类型 定义消息类型时,可能希望其中一个字段只包含预定义值列表中的一个.例如,假设您想为每个SearchRequest添加一个corpus(语料库)字段,其中语料库的值可以是UNIVERSAL.WEB.IMAGES.LOCAL.NEWS.PRODUCTS或VIDEO.您只需在消息定义中添加一个枚举,每个可能的值都有一个常量,就可以做到这一点. 在下面的示例中,我们添加了一个名为Corpus的枚举,其中包含所有可能的值,以及一个类型为Corpus的字段: message SearchReques…
默认值 解析消息时,如果编码的消息不包含特定的单数元素,则解析对象中的相应字段将设置为该字段的默认值.这些默认值是特定于类型的: string:默认值为空字符串 bytes:默认值为空字节 boolean:默认值为false 数值类型:默认值为0 枚举:默认值为第一个定义的枚举值,该值必须是0 消息字段:不设默认值,它的确切值取决于语言.有关详细信息,请参阅生成代码指南 重复字段的默认值为空(通常是适当语言中的空列表). 请注意,对于标量消息字段,一旦解析了消息,就无法判断字段是显式设置为默认值…
定义消息类型 首先让我们看一个非常简单的例子.假设您想定义一个搜索请求消息格式,其中每个搜索请求都有一个查询字符串.您感兴趣的特定结果页以及每页的结果数.下面是用于定义.proto消息类型的文件. syntax = "proto3"; message SearchRequest { string query = 1; int32 page_number = 2; int32 result_per_page = 3; } 文件第一行指定您使用的语法:如果不这样做,协议缓冲区编译器将假定您…
Packages - 包 可以向.proto文件中添加可选的package明符,以防止协议消息类型之间的名称冲突. package foo.bar; message Open { ... } 然后你可以在定义你的消息类型的字段时使用包说明符: message Foo { ... foo.bar.Open open = 1; ... } 包说明符对生成代码的影响取决于您选择的语言: 在C++中,生成的类被封装在C++命名空间内.例如,Open将位于名称空间foo::bar中. 在Java中,该包用…
Oneof - Oneof结构 如果消息包含多个字段,并且最多只能同时设置一个字段,则可以使用oneof功能强制执行此行为并节省内存. oneof字段与常规字段类似,但oneof共享内存中的所有字段除外,并且oneof最多只能同时设置一个字段.设置oneof的任何成员将自动清除所有其他成员.您可以使用特殊的case()或WhichOneof()方法检查oneof中设置了哪个值(如果有被设置),具体取决于您选择的语言. 使用oneof结构 要在.proto中定义oneof结构,请使用oneof关键…
Nested Types - 嵌套类型 您可以在其他消息类型中定义和使用消息类型,如以下示例所示--这里的Result消息是在SearchResponse消息中定义的: message SearchResponse { message Result { string url = 1; string title = 2; repeated string snippets = 3; } repeated Result results = 1; } 如果要在其父消息类型之外重用此消息类型,请将其指定为…
标量值类型 标量消息字段可以具有以下类型之一 -- 下表显示了.proto文件中指定的类型,以及自动生成的类中相应的类型: .proto Type 说明 C++ Type Java Type Python Type[2] Go Type Ruby Type C# Type PHP Type Dart Type double double double float float64 Float double float double float float float float float32 F…
一.前言 前一阵子关于.NET的各大公众号都发表了关于gRpc的消息,而随之而来的就是一波关于.NET Core下如何使用的教程,但是在这众多的教程中基本都是泛泛而谈,难以实际在实际环境中使用,而该篇教程以gRpc为主,但是使用了其SSL/TLS,这样更加符合实际的生产使用,期间也会配套的讲解Docker.openssl等. 二.服务端 a.准备工作 笔者的项目分为三个部分分别如下所示: Sino.GrpcService.Host(控制台):宿主程序 Sino.GrpcService.Impl(…
NET Core下使用gRpc公开服务(SSL/TLS) 一.前言 前一阵子关于.NET的各大公众号都发表了关于gRpc的消息,而随之而来的就是一波关于.NET Core下如何使用的教程,但是在这众多的教程中基本都是泛泛而谈,难以实际在实际环境中使用,而该篇教程以gRpc为主,但是使用了其SSL/TLS,这样更加符合实际的生产使用,期间也会配套的讲解Docker.openssl等. 二.服务端 a.准备工作 笔者的项目分为三个部分分别如下所示: Sino.GrpcService.Host(控制台…
.net core grpc 系统服务实现通信(一) 现在系统都服务化,.net core 实现服务化的方式有很多,我们通过grpc实现客户端.服务端通信. grpc(https://grpc.io/)是google发布的一个开源.高性能.通用RPC(Remote Procedure Call)框架,使用HTTP/2协议,支持多路复用,并用ProtoBuf作为序列化工具,提供跨语言.跨平台支持.下面以.net core演示如何使用grpc框架实现通信. 软件版本 .net core:2.0 gr…
现在系统都服务化,.net core 实现服务化的方式有很多,我们通过grpc实现客户端.服务端通信. grpc(https://grpc.io/)是google发布的一个开源.高性能.通用RPC(Remote Procedure Call)框架,使用HTTP/2协议,支持多路复用,并用ProtoBuf作为序列化工具,提供跨语言.跨平台支持.下面以.net core演示如何使用grpc框架实现通信. 软件版本 .net core:2.0 grpc:1.11.0 项目结构 InstallGrpc…
文章来自gRPC 官方文档中文版 本教程提供了C++程序员如何使用gRPC的指南. 通过学习教程中例子,你可以学会如何: 在一个 .proto 文件内定义服务. 用 protocol buffer 编译器生成服务器和客户端代码. 使用 gRPC 的 C++ API 为你的服务实现一个简单的客户端和服务器. 假设你已经阅读了概览并且熟悉protocol buffers. 注意,教程中的例子使用的是 protocol buffers 语言的 proto3 版本,它目前只是 alpha 版:可以在pr…
文章来自gRPC 官方文档中文版 概览 开始 欢迎进入 gRPC 的开发文档,gRPC 一开始由 google 开发,是一款语言中立.平台中立.开源的远程过程调用(RPC)系统. 本文档通过快速概述和一个简单的 Hello World 例子来向您介绍 gRPC .你可以在本站发现更详细的教程和参考文档--文档将会越来越丰富. 快速开始 为了直观地着手运行 gRPC,可以从你所选择的语言对应的快速开始入手,里面包含创建这个列子的安装指导.快速上手指南等更多内容. C++ Java Go Pytho…
.Net Core 3.0已经把Grpc作为一个默认的模板引入,所以我认为每一个.Net程序员都有学习Grpc的必要,当然这不是必须的. 我在我的前一篇文章中介绍并创建了一个.Net Core 3.0使用Grpc进行远程过程调用文章. ,自我感觉是跑起来了,但是代码间的耦合度太高了,因此在园中找到了@蜗牛丨大神的.net core grpc 实现通信(一)文章,其中完美介绍了如何在.Net Core中使用Grpc进行通信,在按照文章编写代码的时候也是发现很多类库已经升级,文章所介绍的方式有时并不…
简介 更多内容参考:https://www.grpc.io/docs/guides/ gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计.目前提供 C.Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持. gRPC 基于 HTTP/2 标准设计,带来诸如双向流.流控.头部压缩.单 TCP 连接上的…
Andoird TCP通讯 前言 最近在写一个即时通讯的项目,有一些心得,写出来给大家分享指正一下. 简单描述一下这个项目: 实时查询车辆运行状态的项目,走TCP通迅. 接口采用GZIP压缩. 后台是通过Apache的Mina框架 每隔30秒需要发一个心跳包来维持在线状态,如果服务器长时间收不到心跳包,会主动断开链接. 客户端发送命令消息均采用Protobuff3.0协议进行封装. 关于Protobuff3.0不太懂的,可以看一下我上一篇简书Proto3 语言指南 关于此项目会遇到的难点 APP…
Protobuf 语言指南(proto3) Protocol Buffer是Google的语言中立的,平台中立的,可扩展机制的,用于序列化结构化数据 - 对比XML,但更小,更快,更简单.您可以定义数据的结构化,然后可以使用特殊生成的源代码轻松地在各种数据流中使用各种语言编写和读取结构化数据. 定义消息类型 先来看一个非常简单的例子.假设你想定义一个“搜索请求”的消息格式,每一个请求含有一个查询字符串.你感兴趣的查询结果所在的页数,以及每一页多少条查询结果.可以采用如下的方式来定义消息类型的.p…
Arena分配是仅C++有的功能,在使用Protocol Buffer时,它可以帮助你优化你的内存使用,提高性能.在.proto文件中启用Arena分配会在生成的C++代码中添加处理Arena分配的额外代码.关于Arena分配API的细节,详见Arena Allocation Guide. 服务 如果.proto文件中包含下面的内容: option cc_generic_services = true; 之后,Protocol Buffer编译器会根据在本节中描述的文件中找到的服务定义生成代码.…
本章节实际上是介绍Protocol Buffer编译器从给定的protocol定义中生成的C++代码.所有proto2和proto3生成的代码不同之处都会高亮标出 --- 需要注意的是这些不同之处只是生成的代码中的不同,而不是消息类/接口(同一版本的编译器生成的是一样的)的不同.开始之前,你应该先了解proto2 language guide或proto3 language guide. 编译器调用 使用--cpp_out=命令行参数,Protocol Buffer编译器会生成C++输出.--c…