精华内容
参与话题
问答
  • Protobuf 详解

    万次阅读 2019-04-28 11:03:29
    Protobuf全称是Google Protocol Buffer,是一种高效轻便的结构化数据存储方式,可用于(数据)通信协议、数据存储等。 也可以理解为结构化数据的序列化方法,可简单类比为XML(这里主要是指在数据通信和数据存储这些...

    简介

    Protobuf全称是Google Protocol Buffer,是一种高效轻便的结构化数据存储方式,可用于(数据)通信协议、数据存储等。
    也可以理解为结构化数据的序列化方法,可简单类比为XML(这里主要是指在数据通信和数据存储这些应用场景中序列化方面的类比,但个人认为XML作为一种扩展标记语言和Protobuf还是有着本质区别的),其具有以下特点:

    • 语言无关,平台无关
      Protobuf支持Java, C++, Python等多种语言,支持多个平台。
    • 高效
      比XML更小(3~10倍),更快(20 ~ 100倍),更为简单。
    • 扩展性,兼容性好
      你可以更新数据结构,而不影响和破坏原有的旧程序。

    这里稍微解释一下序列化:
    **序列化:**将数据结构或对象转换成能够被存储和传输(例如网络传输)的格式,同时应当要保证这个序列化结果在之后(可能是另一个计算环境中)能够被重建回原来的数据结构或对象。

    Protobuf 使用

    • 创建.proto文件,定义数据结构
      例如:
    //例:在xxx.proto文件中定义Example1 message
    message Example1{
    	optional string stringVal =1;
    	optional bytes bytesVal =2;
    	message EmbeddedMessage{
    		int32 int32Val = 1;
    		string stringVal = 2;
    	}
    	optional EmbededMessage embeddedExample = 3;
    	repeated int32 repeatedInt32Val = 4;
    	repeated string repeatedStringVal = 5;	
    }
    

    我们在上例中定义了一个名为 Example1 的 消息,语法很简单,message 关键字后跟上消息名称:

    message xxx{
    }
    

    之后我们在其中定义了message具有的字段,形式为:

    message xxx {
      // 字段规则:required -> 字段只能也必须出现 1 次
      // 字段规则:optional -> 字段可出现 0 次或多次
      // 字段规则:repeated -> 字段可出现任意多次(包括 0)
      // 类型:int32、int64、sint32、sint64、string、32-bit ....
      // 字段编号:0 ~ 536870911(除去 19000 到 19999 之间的数字)
      字段规则 类型 名称 = 字段编号;
    }
    

    在上例中,我们定义了:

    • 类型string,名为stringVal的optional可选字段,字段编号为1,此字段可出现0次或1次
    • 类型bytes,名为bytesVal的optional可选字段,字段编号为2,此字段可出现0次或1次
    • 类型 EmbeddedMessage(自定义的内嵌 message 类型),名为 embeddedExample1 的 optional 可选字段,字段编号为 3,此字段可出现 0 或 1 次
    • 类型 int32,名为 repeatedInt32Val 的 repeated 可重复字段,字段编号为 4,此字段可出现 任意多次(包括 0)
    • 类型 string,名为 repeatedStringVal 的 repeated 可重复字段,字段编号为 5,此字段可出现 任意多次(包括 0)

    关于proto2定义message消息的更多语法细节,例如具体支持哪些类型,字段编号分配,import导入定义,请参考文章最后的Reference。

    1. protoc编译.proto文件生成读写接口
      我们在.proto文件中定义了数据结构,这些数据结构是面向开发者和业务程序的,并不面向存储和传输。
      当需要把这些数据进行存储或传输时,就需要将这些结构数据进行序列化、反序列化以及读写。那么如何实现呢?不用担心,ProtoBuf 将会为我们提供相应的接口代码。如何提供?答案就是通过 protoc 这个编译器。
      可通过如下命令生成相应的接口代码:
    // $SRC_DIR: .proto 所在的源目录
    // --cpp_out: 生成 c++ 代码
    // $DST_DIR: 生成代码的目标目录
    // xxx.proto: 要针对哪个 proto 文件生成接口代码
    
    protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/xxx.proto
    

    最终生成的代码将提供类似如下的接口:

    Reference:
    https://www.jianshu.com/p/a24c88c0526a

    展开全文
  • Protobuf的简单介绍、使用和分析

    万次阅读 2016-03-06 16:56:56
    Protobuf的简单介绍、使用和分析 一、protobuf是什么?  protobuf(Google Protocol Buffers)是Google提供一个具有高效的协议数据交换格式工具库(类似Json),但相比于Json,Protobuf有更高的转化效率,时间...

    Protobuf的简单介绍、使用和分析


    一、protobuf是什么?

            protobuf(Google Protocol Buffers)是Google提供一个具有高效的协议数据交换格式工具库(类似Json),但相比于Json,Protobuf有更高的转化效率,时间效率和空间效率都是JSON的3-5倍。后面将会有简单的demo对于这两种格式的数据转化效率的对比。但这个库目前使用还不是太流行,据说谷歌内部很多产品都有使用。

     

    二、protobuf有什么?

            Protobuf 提供了C++、java、python语言的支持,提供了windows(proto.exe)和linux平台动态编译生成proto文件对应的源文件。proto文件定义了协议数据中的实体结构(message ,field)

    关键字message: 代表了实体结构,由多个消息字段(field)组成。

    消息字段(field): 包括数据类型、字段名、字段规则、字段唯一标识、默认值

    数据类型:常见的原子类型都支持(在FieldDescriptor::kTypeToName中有定义)

    字段规则:(在FieldDescriptor::kLabelToName中定义)

            required:必须初始化字段,如果没有赋值,在数据序列化时会抛出异常

            optional:可选字段,可以不必初始化。

            repeated:数据可以重复(相当于java 中的Array或List)

            字段唯一标识:序列化和反序列化将会使用到。

    默认值:在定义消息字段时可以给出默认值。

     

    三、protobuf有什么用?

            Xml、Json是目前常用的数据交换格式,它们直接使用字段名称维护序列化后类实例中字段与数据之间的映射关系,一般用字符串的形式保存在序列化后的字节流中。消息和消息的定义相对独立,可读性较好。但序列化后的数据字节很大,序列化和反序列化的时间较长,数据传输效率不高。

            Protobuf和Xml、Json序列化的方式不同,采用了二进制字节的序列化方式,用字段索引和字段类型通过算法计算得到字段之前的关系映射,从而达到更高的时间效率和空间效率,特别适合对数据大小和传输速率比较敏感的场合使用。

    四、Protobuf在Android上的使用

    1、创建proto文件,定义消息的实体结构

    2、编译proto文件生成对应的java文件

    3、添加protobuf-java-2.5.0.jar到android工程

    4、在android中实现对消息结构的序列化/反序列化  

     

    五、Protobuf与json的对比

    1、创建product.proto文件

            定义了三个Message(ProductInfo、PhoneInfo、Watch)消息结构

    2、消息结构对应的java类(ProductInfo、PhoneInfo、Watch)

     

    3、消息结构和java对象赋值

    PhoneName:” idol3”

    Price:2000

    Top:1

     

    WatchName:” tcl watch”

    Price:1000

    Top:1

     

    4、JSON字符串

     

    {"phone":{"phoneName":"idol3","price":2000,"top":1},"watch":{"watchName":"tcl wtch","top":1,"price":1000}}

     

    5、Protobuf转化后的二进制文件

     

    空间效率

    Json:107个字节

    Protobuf:32个字节

     

    时间效率

    Json序列化: 1ms ,  反序列化:0ms

    Protobuf 序列化: 0ms 反序列化:0ms

     

    将public List<Phone> list和repeated PhoneInfo phoneInfoList =3;都赋值为1000个PhoneInfo

     

    空间效率

    Json:4206个字节

    Protobuf:1332个字节

     

    时间效率

    Json序列化: 4ms ,  反序列化:1ms

    Protobuf 序列化: 1ms 反序列化:0ms

    六、protobuf的简单分析

    1、优缺点

    优点:通过以上的时间效率和空间效率,可以看出protobuf的空间效率是JSON的2-5倍,时间效率要高,对于数据大小敏感,传输效率高的模块可以采用protobuf库

     

    缺点:消息结构可读性不高,序列化后的字节序列为二进制序列不能简单的分析有效性;目前使用不广泛,只支持java,C++和Python;

     

    2、数据序列化/反序列化

    a、规则:

    protobuf把消息结果message也是通过 key-value对来表示。只是其中的key是采取一定的算法计算出来的即通过每个message中每个字段(field index)和字段的数据类型进行运算得来的key = (index<<3)|type;

    type类型的对应关系如下:

     

    Type

    Meaning

    Used For

    0

    Varint

    int32, int64, uint32, uint64, sint32, sint64, bool, enum

    1

    64-bit

    fixed64, sfixed64, double

    2

    Length-delimited

    string, bytes, embedded messages, packed repeated fields

    3

    Start group

    groups (deprecated)

    4

    End group

    groups (deprecated)

    5

    32-bit

    fixed32, sfixed32, float

     

    Value会根据数据类型的不同会有两种表现形式:

    对于各种int,bool,enum类型,value就是Varint

    对于string,bytes,message等等类型,value就是length+原始内容编码

     

    Varints是一种紧凑表示数字的方法。它用一个或者多个字节表示一个数字,值越小的数字字节数越少。相对于传统的用4字节表示int32类型数字,Varints对于小于128的数值都可以用一个字节表示,大于128的数值会用更多的字节来表示,对于很大的数据则需要用5个字节来表示。

     

    Varints算法描述: 每一个字节的最高位都是有特殊含义的,如果是1,则表示后续的字节也是该数字的一部分;如果是0,则结束

    b、demo生成的的二进制文件反序列化。

    第1个字节 (0A)

    字段索引(index):         0A = 0001010  0A>>3 = 001 = 1

    数据类型(type):           0A = 0001010&111  = 2 (String);

     

    第2个字节 (0C)

    字符串长度(length):      0E = 12;

    字符串:                         0A 05 69 64 6F 6C 33 10 01 18 BD 0F

     

    第3个字节 (0A)

    因为字符串是来自phoneInfo属于嵌套类型

    字段索引(index):         0A = 0001010  0A>>3 = 001 = 1

    数据类型(type):           0A = 0001010&111  = 2 (String);


    第4-9个字节(69 64 6F 6C 33)

    字符串长度(length):    05 = 5

    字符串:                       69 64 6F 6C 33 = idol3

     

    第10个字节 (10)

    字段索引(index):         10 = 00010000    10A>>3 = 0010 = 2

    数据类型(type):           10 = 00010000&111  = 0 (Varints);

     

    第11个字节  (01)

    Varints:                          01 = 00001字节的最高位为0 整数结束

    Value:                            1;

     

    第12个字节(18)

    字段索引(index):           18 = 00011000    18>> 00011 = 3

    数据类型(type):           18 = 00011000&111  = 0 (Varints);

     

    第13个字节(D0)

    最高位为1,整数计算到下一个字节

     

    第14个字节(0F)

    最高位为0,整数计算结束

    Value:为11111010000 =2000

     

    C、反序列化结果

    phoneinfo为

    phoneName = “idol3”

    top = 1

    price = 2000;

     

    同样的方法watchInfo为:

    watchName = “tcl name”

    top = 1

    price=2000 

    3、时间效率

    通过protobuf序列化/反序列化的过程可以得出:protobuf是通过算法生成二进制流,序列化与反序列化不需要解析相应的节点属性和多余的描述信息,所以序列化和反序列化时间效率较高。

    4、空间效率

    xml、json是用字段名称来确定类实例中字段之间的独立性,所以序列化后的数据多了很多描述信息,增加了序列化后的字节序列的容量。

     

    Protobuf的序列化/反序列化过程可以得出:

    protobuf是由字段索引(fieldIndex)与数据类型(type)计算(fieldIndex<<3|type)得出的key维护字段之间的映射且只占一个字节,所以相比json与xml文件,protobuf的序列化字节没有过多的key与描述符信息,所以占用空间要小很多。

    七、Protobuf的源码分析

    1、protobuf在java使用的序列化流程

     

    java程序调用parserFrom(byte[] data)开始字节序列的反序列,Java程序通过调用编译生类GenerateMessage中的wirteTo()方法开始将序列化后的字节写入输出流中

     

    GenerateMessage 继承AbstractMessage类,序列化最终在AbstractMesssage中完成,序列化的实现过程:

    a、遍历对象中Message结构()

    调用AbstractMessage类中的writeTo()方法

     

    b、 序列化Message中每一个字段

    调用CodeOutputStream类中的writeMessageSetExtension()方法

     

    c、 对于Varints  Tag 的序列化流程:

    调用CodeOutputStream类中的writeUInt32()方法

    调用CodeOutputStream类中的WriteRawVarint32()方法

     

    d、 对于非Varints Tag的序列化

    调用CodeOutputStream类中的WriteTag()方法

     

     

    具体的序列化实现都在CodedOutputStream中完成

     

    2、java使用protobuf 的反序列化流程分析

    java程序通过调用parserFrom(byte[] data)开始反序列化

     

    具体在com.google.protobuf. AbstractParser类中实现

     

     

     

     

     

    最后在com.google.protobuf.CodedInputStream类中完成反序列化

    3、动态编译

    以windows下用protoc.exe工具实现proto文件编译为例,protoc.exe是用C++实现。在控制台执行命令:

    编译的流程:

    检查proto的语法规则

    将proto的文件中的message结构转换为GenerateMessage类的子类,并实现Builder接口。

    编译流程

    Main.cc中的main()方法

     

    Command_line_interface.cc中的Run()方法

     

    Import类中Import()

     

    在Descriptor中完成message消息的收集和转化。

    展开全文
  • protobuf精讲

    2019-09-21 11:51:39
    主要讲解了google protocol buffer(以下简称protobuf)在windows平台和linux平台下的编译及使用。其中涉及跨平台编译管理工具cmake的安装及使用,protobuf的使用例子及原理,以及protobuf的高级使用方法等。
  • Google 的开源技术protobuf 简介与例子

    万次阅读 多人点赞 2010-05-17 10:11:00
    本文来自CSDN博客:http://blog.csdn.net/program_think/archive/2009/05/31/4229773.aspx 今天来介绍一下“Protocol Buffers”(以下简称protobuf)这个玩意儿。本来俺在构思“生产者/消费者模式 ”系列的下一个...

     

     

     

     

    今天来介绍一下“Protocol Buffers”(以下简称protobuf)这个玩意儿。本来俺在构思“生产者/消费者模式 ”系列的下一个帖子:关于生产者和消费者之间的数据传输格式。由于里面扯到了protobuf,想想干脆单独开一个帖子算了。

      ★protobuf是啥玩意儿?
      为了照顾从没听说过的同学,照例先来扫盲一把。
      首先,protobuf是一个开源项目(官方站点在“这里”),而且是后台很硬的开源项目。网上现有的大部分(至少80%)开源项目,要么是某人单干、要么是几个闲杂人等合伙搞。而protobuf则不然,它是鼎鼎大名的Google公司开发出来,并且在Google内部久经考验的一个东东。由此可见,它的作者绝非一般闲杂人等可比。
      那这个听起来牛X的东东到底有啥用处捏?简单地说,这个东东干的事儿其实和XML差不多,也就是把某种数据结构的信息,以某种格式保存起来。主要用于数据存储、传输协议格式等场合。有同学可能心理犯嘀咕了:放着好好的XML不用,干嘛重新发明轮子啊?!先别急,后面俺自然会有说道。
      话说到了去年(大约是08年7月),Google突然大发慈悲,把这个好东西贡献给了开源社区。这下,像俺这种喜欢捡现成的家伙可就有福啦!貌似喜欢捡现成的家伙还蛮多滴,再加上Google的号召力,开源后不到一年,protobuf的人气就已经很旺了。所以俺为了与时俱进,就单独开个帖子来忽悠一把。

      ★protobuf有啥特色?
      扫盲完了之后,就该聊一下技术方面的话题了。由于这玩意儿发布的时间较短(未满周岁),所以俺接触的时间也不长。今天在此是先学现卖,列位看官多多包涵 :-)

      ◇性能好/效率高
      现在,俺就来说说Google公司为啥放着好端端的XML不用,非要另起炉灶,重新造轮子。一个根本的原因是XML性能不够好。
      先说时间开销:XML格式化(序列化)的开销倒还好;但是XML解析(反序列化)的开销就不敢恭维啦。俺之前经常碰到一些时间性能很敏感的场合,由于不堪忍受XML解析的速度,弃之如敝履。
      再来看空间开销:熟悉XML语法的同学应该知道,XML格式为了有较好的可读性,引入了一些冗余的文本信息。所以空间开销也不是太好(不过这点缺点,俺不常碰到)。
      由于Google公司赖以吹嘘的就是它的海量数据和海量处理能力。对于几十万、上百万机器的集群,动不动就是PB级的数据量,哪怕性能稍微提高0.1%也是相当可观滴。所以Google自然无法容忍XML在性能上的明显缺点。再加上Google从来就不缺造轮子的牛人,所以protobuf也就应运而生了。
      Google对于性能的偏执,那可是出了名的。所以,俺对于Google搞出来protobuf是非常滴放心,性能上不敢说是最好,但肯定不会太差。

      ◇代码生成机制
      除了性能好,代码生成机制是主要吸引俺的地方。为了说明这个代码生成机制,俺举个例子。
      比如有个电子商务的系统(假设用C++实现),其中的模块A需要发送大量的订单信息给模块B,通讯的方式使用socket。
    假设订单包括如下属性:
    --------------------------------
      时间:time(用整数表示)
      客户id:userid(用整数表示)
      交易金额:price(用浮点数表示)
      交易的描述:desc(用字符串表示)
    --------------------------------
      如果使用protobuf实现,首先要写一个proto文件(不妨叫Order.proto),在该文件中添加一个名为"Order"的message结构,用来描述通讯协议中的结构化数据。该文件的内容大致如下:

     

    --------------------------------

    message Order
    {
      required int32 time = 1;
      required int32 userid = 2;
      required float price = 3;
      optional string desc = 4;
    }

    --------------------------------

     


      然后,使用protobuf内置的编译器编译 该proto。由于本例子的模块是C++,你可以通过protobuf编译器的命令行参数(看“这里 ”),让它生成C++语言的“订单包装类”。(一般来说,一个message结构会生成一个包装类)
      然后你使用类似下面的代码来序列化/解析该订单包装类:


    --------------------------------

    // 发送方

    Order order;
    order.set_time(XXXX);
    order.set_userid(123);
    order.set_price(100.0f);
    order.set_desc("a test order");

    string sOrder;
    order.SerailzeToString(&sOrder);

    // 然后调用某种socket的通讯库把序列化之后的字符串发送出去
    // ......

    --------------------------------

    // 接收方

    string sOrder;
    // 先通过网络通讯库接收到数据,存放到某字符串sOrder
    // ......

    Order order;
    if(order.ParseFromString(sOrder))  // 解析该字符串
    {
      cout << "userid:" << order.userid() << endl
              << "desc:" << order.desc() << endl;
    }
    else
    {
      cerr << "parse error!" << endl;
    }

    --------------------------------

     


      有了这种代码生成机制,开发人员再也不用吭哧吭哧地编写那些协议解析的代码了(干这种活是典型的吃力不讨好)。
      万一将来需求发生变更,要求给订单再增加一个“状态”的属性,那只需要在Order.proto文件中增加一行代码。对于发送方(模块A),只要增加一行设置状态的代码;对于接收方(模块B)只要增加一行读取状态的代码。哇塞,简直太轻松了!
      另外,如果通讯双方使用不同的编程语言来实现,使用这种机制可以有效确保两边的模块对于协议的处理是一致的。
      顺便跑题一下。
      从某种意义上讲,可以把proto文件看成是描述通讯协议的规格说明书(或者叫接口规范)。这种伎俩其实老早就有了,搞过微软的COM编程或者接触过CORBA的同学,应该都能从中看到IDL(详细解释看“这里 ”)的影子。它们的思想是相通滴。

      ◇支持“向后兼容”和“向前兼容”
      还是拿刚才的例子来说事儿。为了叙述方便,俺把增加了“状态”属性的订单协议成为“新版本”;之前的叫“老版本”。
      所谓的“向后兼容”(backwardcompatible),就是说,当模块B升级了之后,它能够正确识别模块A发出的老版本的协议。由于老版本没有“状态”这个属性,在扩充协议时,可以考虑把“状态”属性设置成非必填 的,或者给“状态”属性设置一个缺省值(如何设置缺省值,参见“这里 ”)。
      所谓的“向前兼容”(forward compatible),就是说,当模块A升级了之后,模块B能够正常识别模块A发出的新版本的协议。这时候,新增加的“状态”属性会被忽略。
      “向后兼容”和“向前兼容”有啥用捏?俺举个例子:当你维护一个很庞大的分布式系统时,由于你无法同时 升级所有 模块,为了保证在升级过程中,整个系统能够尽可能不受影响,就需要尽量保证通讯协议的“向后兼容”或“向前兼容”。

      ◇支持多种编程语言
      俺开博以来点评的几个开源项目(比如“Sqlite ”、“cURL ”),都是支持很多种 编程语言滴,这次的protobuf也不例外。在Google官方发布的源代码中包含了C++、Java、Python三种语言(正好也是俺最常用的三种,真爽)。如果你平时用的就是这三种语言之一,那就好办了。
      假如你想把protobuf用于其它语言,咋办捏?由于Google一呼百应的号召力,开源社区对protobuf响应踊跃,近期冒出很多其它编程语言的版本(比如ActionScript、C#、Lisp、Erlang、Perl、PHP、Ruby等),有些语言还同时搞出了多个开源的项目。具体细节可以参见“这里 ”。
      不过俺有义务提醒一下在座的各位同学。如果你考虑把protobuf用于上述这些语言,一定认真评估对应的开源库。因为这些开源库不是Google官方提供的、而且出来的时间还不长。所以,它们的质量、性能等方面可能还有欠缺。

      ★protobuf有啥缺陷?
      前几天刚刚在“光环效应 ”的帖子里强调了“要同时评估优点和缺点”。所以俺最后再来批判一下这玩意儿的缺点。
      ◇应用不够广
      由于protobuf刚公布没多久,相比XML而言,protobuf还属于初出茅庐。因此,在知名度、应用广度等方面都远不如XML。由于这个原因,假如你设计的系统需要提供若干对外的接口给第三方系统调用,俺奉劝你暂时不要考虑protobuf格式。
      ◇二进制格式导致可读性差
      为了提高性能,protobuf采用了二进制格式进行编码。这直接导致了可读性差的问题(严格地说,是没有可读性)。虽然protobuf提供了TextFormat这个工具类(文档在“这里 ”),但终究无法彻底解决此问题。
      可读性差的危害,俺再来举个例子。比如通讯双方如果出现问题,极易导致扯皮(都不承认自己有问题,都说是对方的错)。俺对付扯皮的一个简单方法就是直接抓包并dump成log,能比较容易地看出错误在哪一方。但是protobuf的二进制格式,导致你抓包并直接dump出来的log难以看懂。
      ◇缺乏自描述
      一般来说,XML是自描述的,而protobuf格式则不是。给你一段二进制格式的协议内容,如果不配合相应的proto文件,那简直就像天书一般。
      由于“缺乏自描述”,再加上“二进制格式导致可读性差”。所以在配置文件方面,protobuf是肯定无法取代XML的地位滴。

      ★为什么俺会用上protobuf?
      俺自从前段时间接触了protobuf之后,就着手把俺负责的产品中的部分数据传输协议替换成protobuf。可能有同学会问,和protobuf类似的东东也有不少,为啥独独相中protobuf捏?由于今天写的篇幅已经蛮长了,俺卖个关子,把这个话题留到“生产者/消费者模式[5]:如何选择传输协议及格式?”。俺会在后续的这个帖子里对比各种五花八门的协议格式,并谈谈俺的浅见。v



    参考CSDN博客(已关闭):http://blog.csdn.net/program_think/archive/2009/05/31/4229773.aspx



    展开全文
  • Protobuf版本下载地址

    万次阅读 2018-12-14 12:07:13
    记录下protobuf https://github.com/protocolbuffers/protobuf/releases/tag/v3.6.1 官方protobuf所有都在,如果后面更新了版本,只需要更改后的v.几版本,前面的版本都可以下载,这里是最新的。 对于很多不能...

    记录下protobuf

    https://github.com/protocolbuffers/protobuf/releases/tag/v3.6.1

    官方protobuf所有都在,如果后面更新了版本,只需要更改后的v.几版本,前面的版本都可以下载,这里是最新的。

    对于很多不能访问Google,这个要方便多了。不过网速很慢,上传了部分百度云的protobuf。

    链接:https://pan.baidu.com/s/1Gm5RWtVVY3iTYLZB84oOQg 
    提取码:rifi 
    然后这个使用,我推荐这篇博客吧

    要下载的东西,一个win32,protobuf.tar吧,我也不是很清楚,还有配置环境变量。

    要是不行,就下载一个protobuf试试。

    在windows的使用

    https://blog.csdn.net/liupeifeng3514/article/details/78985575

    ----------------20181228更新--------------

    以下是学习这个东西的感悟,这个东西说实话至今还是没弄懂怎么玩?可能只有生成的那一瞬间有那么一丝快乐,又少写了好多代码。这玩意java方面弄出来了,JavaScript反而没有弄出来,以至于一开始想要使用这个来前后端分离并没有完成,网上的一大堆都是无用功。

    说说现在能使用的功能吧,反正百度一大堆说这玩意速度快,比json数据好用,说实话确实好用一点点,它比json少“,”、“:”、“{}”、“【】”这类数据,而且是直接序列化后东西,需要反序列化才能读出来。

    同时,网上说这个东西比什么java自带的

    Serializable

    快,反正没感觉,可能测试量太小,没感觉。我不是那些大佬,随便玩这些东西。

    里面的方法没有详细的API使用教程和实例,完全并不会使用。

    感觉唯一用处读取大量数据时,效率速度快吧。

    展开全文
  • protobuf 3.5.0

    2017-12-10 00:03:43
    protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。...由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用...Source code (protobuf-3.5.0.tar.gz)
  • Protobuf3教程

    万次阅读 2018-06-27 11:49:15
    定义一个消息类型 指定字段类型 分配标识号 指定字段规则 添加更多消息类型 添加注释 保留标识符(Reserved) 从.proto文件生成了什么? 标量数值类型 默认值 枚举 使用其他消息类型 ...Oneof 特性...
  • 序列化和反序列化 有些时候,我们希望将对象保存到文件中,或者传输给其他的应用程序。比如:web网页后端和前端的数据交互,应用程序产生的中间数据等等。 这种将数据结构或对象以某种格式转化为字节流的过程,称之...
  • Protobuf的直白理解

    千次阅读 2018-11-14 21:14:00
    前面一章已经讲述了protobuf的安装过程,接下来讲述protobuf是什么东西,最直白的理解。 这里直接给出一篇直白的入门理解博客内容:Google 的开源技术protobuf 简介与例子 ★protobuf是啥玩意儿? 为了照顾从没听说...
  • Protobuf的介绍

    万次阅读 2018-07-20 11:26:05
    参看:https://blog.csdn.net/carson_ho/article/details/70568606 参看:... 一、简介  Google Protocol Buffer(简称Protobuf)是Google公司内部的混合语言数据标准,用于RPC系统...
  • Protobuf3语言指南

    万次阅读 多人点赞 2017-01-25 22:14:47
    定义一个消息类型 指定字段类型 分配标识号 指定字段规则 添加更多消息类型 添加注释 保留标识符(Reserved) 从.proto文件生成了什么? 标量数值类型 默认值 枚举 使用其他消息类型 导入定义 ...包及
  • Google Protocol Buffers(简称Protobuf)是一款非常优秀的库,它定义了一种紧凑(相对XML和JSON而言)的可扩展二进制消息格式,特别适合网络数据传输。 在网络编程中使用Protobuf需要解决以下两个问题: 长度。...
  • Protobuf简单使用及其抓包分析

    万次阅读 2014-12-24 11:36:06
    早之前就用过Google的Protobuf做数据编码,一直没有深入理解其中的原理,最近做了一次通讯抓包,发现其中很多Protobuf编码的数据包,于是决定分析一下其中的数据包及其编码。一、Protobuf的使用首先来简单介绍一下...
  • Protobuf简介      ProtoBuf在网络通信、通用数据交换等场景的效率、兼容性等方面非常出色。 介绍      protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)...
  • Google ProtoBuf用法

    2019-01-10 10:57:40
    Google Protobuf是Netty中常用的编解码工具,Protobuf支持数据结构化一次可以到处使用,且可以跨语言使用,通过代码生成工具可以生成不同语言版本的源代码,还可以在使用不同版本的数据结构进程间进行数据传递,实现...
  • protobuf与json互相转换

    千次阅读 2018-06-10 12:47:13
    Java http://code.google.com/p/protobuf-java-format/ maven &lt;dependency&gt; &lt;grou
  • protobuf作为网络通信时的消息载体,不仅效率高,而且还加快开发进度,减少了BUG。 但是protobuf消息生成的类,不管是C++\Java还是其他第三方支持的语言C等生成的消息类,都不太适合用于业务逻辑处理(没有100%的...
  • Protobuf协议格式详解

    万次阅读 2019-10-12 11:56:44
    protobuf 是google开源的一个序列化框架,类似xml,json,最大的特点是基于二进制,比传统的XML表示同样一段内容要短小得多。还可以定义一些可选字段,用于服务端与客户端通信。前面几篇文章说了protobuf的用法,...
  • 在嵌入式设备中使用protobuf

    千次阅读 2016-03-02 20:34:13
    protobuf移植
  • protobuf

    千次阅读 2018-08-08 12:14:11
    protobuf protobuf 优点 编译安装 syntax basic 字段修饰符 字段类型 varint message存储格式 生成代码 基类::google::protobuf::Message 序列化 反序列化 getter、setter - clear_field():重置字段 - ...
  • 服务器protobuf版本,3.0.0 本地pc的protobuf版本,3.0.0 使用python的requests库做接口自动化测试,首先尝试登陆自动化。 UserLogin.proto的文件内容如下 ![图片说明]...
  • Practical Netty (3) 在Netty中使用Protobuf

    万次阅读 2013-01-08 22:24:38
    Practical Netty (3) 在Netty中使用Protobuf作者:柳大·Poechant(钟超)邮箱:zhongchao.ustc#gmail.com(# -> @)博客:Blog.CSDN.net/Poechant微博:weibo.com/lauginhom日期:June 8th, 20121. Netty 核心概念...
  • protobuf入门教程(一):简介和安装

    千次阅读 2017-06-27 17:29:57
    1.1 简介1.1.1 什么是protobufprotobuf也叫protocol buffer是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的...
  • protobuf文件详解

    千次阅读 2019-05-29 12:16:38
    通信方式 一个请求对象对应一个返回对象 rpc Login(LoginRequest) returns (LoginResponse) {} 一个请求对象,服务器返回多个结果 rpc Login(LoginRequest) returns (stream LoginResponse) {} ...
  • Protobuf的使用

    千次阅读 2018-11-27 21:02:01
    在网站http://mvnrepository.com/artifact/com.google.protobuf/protobuf-java/3.4.0下载Jar包,在网站https://github.com/google/protobuf/releases下载工具,选择windows版本, 解压protoc-3.4.0-win32.zip并...
  • 深入Protobuf源码-概述、使用以及代码生成实现 概述 捣鼓hdfs、yarn、hbase、zookeeper的代码一年多了,是时候整理一下了。在hadoop (2.5.2)中protobuf是节点之间以及客户端和各个节点通信的基础序列化框架...
  • google protobuf 数据格式

    千次阅读 2014-12-11 15:12:39
    Protobuf消息定义 消息由至少一个字段组合而成,类似于C语言中的结构。每个字段都有一定的格式。 字段格式:限定修饰符① | 数据类型② | 字段名称③ | = | 字段编码值④ | [字段默认值⑤] ①.限定修饰符...
  • protobuf 3.1.0 安装示例和使用指南说明 说明: 本文例子见: https://github.com/githublefantian/protobuf-3.1.0example.git 1、protobuf是google公司提出的数据存储格式,详细介绍可以参考:...
  • <br />这篇文章要解决的问题是:在接收到 protobuf 数据之后,如何自动创建具体的 Protobuf Message 对象,再做的反序列化。“自动”的意思是:当程序中新增一个 protobuf Message 类型时,这部分代码不需要...

空空如也

1 2 3 4 5 ... 20
收藏数 460,696
精华内容 184,278
关键字:

protobuf