Google Protocol Buffer(简称 Protobuf)是一种轻便高效的结构化数据存储格式,平台无关、语言无关、可扩展,可用于通讯协议和数据存储等领域。
框架git地址: https://github.com/google/protobuf
Protobuf消息定义:
syntax="proto2"; //编译器版本: proto2, proto3 package com.seasy.proto; //包名 import "article.proto"; //导入其他proto文件 message PrintDatamatrix{ required string title = 1; required int32 width = 2 [default=100]; required int32 height = 3 [default=100]; required bytes bitmap = 4; optional string file_path = 5; enum PhoneType{ //枚举值必须大于等于0的整数 MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber{ optional string number = 1;
required PhoneType type = 2 [default=WORK]; } repeated PhoneNumber phone = 6; repeated int32 article_numberofwords = 7 [packed=true]; //packed只能用于repeated数值类型的字段,使其更有效的encode required float price = 8; map<string, Project> projects = 9; reserved 90, 100, 120 to 150; //保留的编号标签,不会被使用 extensions 100 to 1000; //供第三方扩展用的编号标签 }
常用的数据类型: double, float, int32, int64, bool, string, bytes
编译proto文件
protoc --java_out=./output ./PrintDatamatrix.proto
protoc --cpp_out=./output ./PrintDatamatrix.proto
范例:
proto文件定义
syntax="proto2"; package com.seasy.proto; option java_outer_classname = "PrintDatamatrix"; message PrintDatamatrixDT{ enum PhoneType{ MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber{ required PhoneType type = 2 [default=MOBILE]; optional string number = 1; } required string title = 1; required int32 width = 2 [default=100]; required int32 height = 3 [default=100]; required bytes bitmap = 4; optional string file_path = 5; optional bool auto_show = 6; optional double price = 7; optional float salary = 8; repeated PhoneNumber phone = 9; repeated int32 article_number = 10 [packed=true]; map<string, int64> projects = 11; }
java使用(发送端)
PrintDatamatrix.PrintDatamatrixDT.Builder builder = PrintDatamatrix.PrintDatamatrixDT.newBuilder(); builder.setTitle("title"); builder.setWidth(100); builder.setHeight(100); builder.setBitmap(ByteString.copyFrom("123456", Charset.forName("UTF-8"))); builder.setFilePath(""); builder.setAutoShow(true); builder.setPrice(1.0); builder.setSalary(1.0F); PrintDatamatrix.PrintDatamatrixDT.PhoneNumber.Builder phoneNumberBuilder = PrintDatamatrix.PrintDatamatrixDT.PhoneNumber.newBuilder(); phoneNumberBuilder.setNumber("123"); phoneNumberBuilder.setType(PhoneType.HOME); builder.addPhone(phoneNumberBuilder); builder.addPhone(PrintDatamatrix.PrintDatamatrixDT.PhoneNumber.newBuilder().setNumber("456").setType(PhoneType.WORK)); builder.addArticleNumber(1); builder.addArticleNumber(2); builder.putProjects("p1", 1); builder.putProjects("p2", 2); byte[] dataBytes = builder.build().toByteArray();
java使用(接收端)
PrintDatamatrix.PrintDatamatrixDT dt = PrintDatamatrix.PrintDatamatrixDT.parseFrom(dataBytes); System.out.println(dt.getTitle()); System.out.println(dt.getWidth()); System.out.println(dt.getHeight()); System.out.println(dt.getBitmap().toStringUtf8()); System.out.println(dt.getFilePath()); System.out.println(dt.getAutoShow()); System.out.println(dt.getPrice()); System.out.println(dt.getSalary()); for(PhoneNumber pn : dt.getPhoneList()){ System.out.println(pn.getNumber() + ", " + pn.getType().name()); } for(Integer i : dt.getArticleNumberList()){ System.out.println(i); } for(Iterator<String> it=dt.getProjectsMap().keySet().iterator(); it.hasNext();){ String key = it.next(); System.out.println(key + "=" + dt.getProjectsMap().get(key)); }
相关推荐
Protobuf 使用手册 本文档旨在提供一个详细的 Protobuf 使用手册,涵盖了 protobuf 的常见使用方法、内部原理实现的介绍、使用经验建议等。同时,也分别介绍了 protobuf 在 C++、Python、Java 的使用。 一、...
Protocol Buffers是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。它不依赖于语言和平台并且可扩展性极强。现阶段官方支持C++、JAVA、Python等三种编程语言...
在这个“android protobuf 使用demo”中,我们将深入探讨如何在Android项目中集成和使用protobuf。 首先,我们需要了解.proto文件。这是一种文本格式的文件,用于定义protobuf的消息类型。例如: ```proto syntax ...
**protobuf简介** Google ProtoBuf(Protocol Buffers)是一种数据序列化协议,用于高效地存储和传输结构化数据。...在Java中,通过简单的步骤就可以实现ProtoBuf的使用,从而提升应用程序的性能和可维护性。
**protobuf使用示例** protobuf(Protocol Buffers)是Google开发的一种数据序列化协议,它可以将结构化的数据序列化,可用于数据存储、通信协议等方面。它提供了比XML更小、更快、更简单的方式来让结构化数据进行...
2. 编译 Protocol Buffers:使用 Visual Studio 打开 Protocol Buffers 的工程文件(protobuf.sln),然后进行编译。 3. 生成代码:使用 protoc 工具将 proto 文件编译成对应的代码。 4. 使用生成的代码:将生成的...
2. **编译消息类型**: 使用protobuf编译器protoc,将.proto文件编译成对应编程语言的类库。 3. **序列化和反序列化**: 编译后的类库提供了序列化和反序列化的方法,可以将对象转换为字节流,也可以从字节流恢复...
虽然Protobuf本身不包含加密功能,但它可以与现有的加密技术结合使用,如SSL/TLS或AES等,实现数据的安全传输。在通信过程中,可以在Protobuf序列化后的二进制数据上添加一层加密,保证数据在传输过程中的安全性。 ...
**protobuf使用案例** protobuf,全称Protocol Buffers,是Google推出的一种数据序列化协议,用于高效地存储和传输数据。它能将结构化的数据序列化为二进制流,相比JSON和XML,protobuf在性能和数据大小方面都有...
### protobuf c++ 使用手册 #### 1.1 什么是 Protocol Buffer? Protocol Buffer(简称 Protobuf)是 Google 开发的一种数据交换格式,它高效、简洁且易于人工编写和阅读。Protobuf 提供了一种序列化结构化数据的...
通过使用Protobuf,开发者可以定义数据结构,然后自动生成相应的源代码,以便在多种编程语言中方便地处理结构化数据。对于C++开发,Protobuf会生成消息类,并提供API函数用于读写消息。 ### 1. Ubuntu平台上安装...
4. **优化内存占用**:在 Android 上,由于内存限制,使用 Protobuf 可以有效减少序列化数据的内存占用,提高性能。 **三、Java 中的 Protobuf 使用** 1. **Java API**:在 Java 应用中,Protobuf 提供了丰富的 ...
(1) protobuf-net:项目使用的插件,就是从 protobuf-net-2.1.0-alpha-5/protobuf-net 直接拖入的 (2) WebPlayerTemplates/protobuf-net: 老版本的可用插件。因为新拖入的插件还没有完整测试过,这里保留一下老的 (3...
在 Linux 系统上,可以使用以下命令安装 protobuf: ``` sudo apt-get install protobuf-compiler ``` ### 2. 编写 .proto 文件 创建一个名为 `detect.proto` 的文件,并添加以下内容: ``` syntax = "proto3"; ...
里面含有 protobuf3.13.0 用cmake MSVC 编译的动态链接库。 里面有debug,release 32位和64位的 lib,dll,exe. 包含一个简单的序列化 反序列化的Qt demo。
- **高效编码**:protobuf使用变长编码,对整数和字符串进行高效存储,节省空间。 - **零拷贝**:在某些场景下,protobuf可以实现从内存到网络的零拷贝传输,提高效率。 - **增量更新**:FieldMask支持只更新消息...
ProtoBuf使用了基于128的Varints来编码数据。它可以将数据编码成一个紧凑的二进制格式,使得数据传输更加高效。 ProtoBuf还支持可选的和重复的元素、内嵌消息、字段顺序等功能。 6. C++基础 ProtoBuf在C++中的实现...