一、简介

proto3是新版本的protobuf语法。它简化了部分语法,并扩大了支持的语言,Ruby、C#。目前谷歌推荐只在是用新支持的语言或使用新的gRPC框架的时候使用。
proto2和proto3不是完全兼容的。这里列出一些proto2与proto3的区别。

二、proto3

希望编译器使用proto3进行编译需要在文件对行加上:

syntax = "proto3";

下面是一个简单的例子:

syntax = "proto3";

message Person {
string name = 1;
int32 age = 2;
repeated string loction = 3;
}

可以看到相比于proto2语法这里没有前面的required/optional,在proto3中所有字段都是可选的,同时取消了自定义默认值,默认值为0或空。

枚举

与proto2不同proto3的枚举值第一个值得tag必须为0,同时枚举值的默认值将默认使用第一个值,这样就和其他类型都保持了统一,即默认值为0。

 enum Location {
SHANGHAI = 0;
BEIJING = 1;
GUANGZHOU = 2;
}

同时proto2的枚举类型不能被proto3直接import,但是间接引用不受影响。

Any

proto3不支持proto2中的extension,但是引入了Any。
在使用Any时需要引入any.proto:

import "google/protobuf/any.proto";

message ErrorStatus {
string message = 1;
repeated google.protobuf.Any details = 2;
}
-----------------------
public static void main(String[] args) throws IOException, ClassNotFoundException {
//定义any
Any any= Any.pack(StringValue.newBuilder().setValue("aaa").build());
//赋值并构建
Demo.Person person=Demo.Person.newBuilder().setDetail(any).build();
//取值
System.out.println(person.getDetail().unpack(StringValue.class));
}

三、其他

proto3去除了proto2中group,新增了一些timestamp、empty的格式(需要手动import)。

proto 3 语法的更多相关文章

  1. proto 2 语法

    一.proto文件 PB的定义是通过proto文件进行定义的,一个标准的类型如下: message SearchRequest { required string query = 1; optiona ...

  2. github atom创建自己的语法高亮

    使用atom一段时间了,有些插件还不是很成熟.比如项目中使用protobuf,早就有人写了语法高亮(https://github.com/podgib/atom-protobuf),但是效果不是很好. ...

  3. Protobuf 语法指南

    英文: Proto Buffers Language Guide 本指南描述了怎样使用protocol buffer 语法来构造你的protocol buffer数据,包括.proto文件语法以及怎样 ...

  4. iOS 集成Protobuf,转换proto文件

    原文地址:http://blog.csdn.net/hyq4412/article/details/54891038 附加Homebrew安装地址:https://brew.sh/index_zh-c ...

  5. protobuf 语法 与 protocol-buffers 的使用

    前言 protocol-buffers 是 node.js 平台对支持 protobuf 封装的三方模块,下面的例子都通过 protocol-buffers 的使用来说明. 什么是protobuf G ...

  6. gRPC-Protocol语法指南

    语法指南 (proto3) Defining A Message Type Scalar Value Types Default Values Enumerations Using Other Mes ...

  7. gRPC源码分析0-导读

    gRPC是Google开源的新一代RPC框架,官网是http://www.grpc.io.正式发布于2016年8月,技术栈非常的新,基于HTTP/2,netty4.1,proto3.虽然目前在工程化方 ...

  8. Protocol buffers 介绍

    Protocol buffers和mxl一样在序列化数据结构时很灵活.高效和智能,但是它的优势在于定义文件更小,读取速度更快,使用更加简单.目前protocol buffers支持C++.java和p ...

  9. Protobuf语言指南(转)

    Protobuf语言指南 l  定义一个消息(message)类型 l  标量值类型 l  Optional 的字段及默认值 l  枚举 l  使用其他消息类型 l  嵌套类型 l  更新一个消息类型 ...

随机推荐

  1. spring boot+mybatis+mysql

    spring boot整合mybatis,曾经的几个小困惑和踩的坑. 一.mybatis的结构 mybatis和spring boot的整合,网上无数的教程,都是教你一步步集成,照着做没问题,但做下来 ...

  2. 【转】IT大牛博客

    原文:http://blog.csdn.net/qq1175421841/article/details/49384841 首届中国最受欢迎50大技术博客获奖名单如下: 第一名:李会军  http:/ ...

  3. 关于C#中遍历字符串中的每个字符的方法

    解决方案 C#提供了两个方法用于遍历字符串. 1.第一个方法是foreach循环,这个方法快速且容易,但是与第二个方法相比它不太灵活.其使用方法如下: string testStr = "a ...

  4. pytest学习 一

    网上有很多这样的资料,学起来还是比较简单,为了将学到的东西应用于工程化,参考这样的样板代码: https://github.com/jeffmacdonald/pytest_test 将其下载到C:\ ...

  5. Linux (OpenBSD)系统目录分析

    IER(7)                    OpenBSD Reference Manual                    HIER(7) NAME      hier - layou ...

  6. 安卓sdk webview获取淘宝个人信息100项,源码。

    1.贴出主要代码.这个不是python,python只涉及了服务端对信息提取结果的接受.主体是java  + android + js.由于淘宝各模块都是二级子域名,不能只在一个页面完成所有请求,aj ...

  7. linux应用以及常用命令

    各目录作用"/" :Linux文件系统的入口.也是最高一级的目录."/bin":基本系统所需要的命令,功能和"/usr/bin"类似,这个目 ...

  8. 剑指offer——python【第21题】栈的压入、弹出序列

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...

  9. a链接QQ客服 在小框口中打开 感觉不错

    <a href="javascript:;" onClick="javascript:window.open('http://wpa.qq.com/msgrd?v= ...

  10. kubernetes组成

    kubernetes组成 k8s主要包括: kubectl 客户端命令行工具: 将接收的命令,发送给kube-apiserver,作为对整个平台操作的入口. kube-apiserver REST A ...