`
raymond.chen
  • 浏览: 1418800 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Protobuf的使用

 
阅读更多

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使用手册.doc

    protobuf使用手册,包含protobuf的常见使用方法、内部原理实现的介绍、使用经验建议等。分别介绍了protobuf在c++、python、java的使用。

    protobuf 使用简单示例

    Protocol Buffers是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。它不依赖于语言和平台并且可扩展性极强。现阶段官方支持C++、JAVA、Python等三种编程语言...

    Google ProtoBuf 使用说明

    Google ProtoBuf 安装使用说明

    google protobuf使用的简单介绍.pptx

    google protobuf的简单实用方法,主要用于向他人介绍。 可以用于数据传输和单元测试中 google protobuf的简单实用方法,主要用于向他人介绍。 可以用于数据传输和单元测试中

    protoBuf使用demo

    protoBuf Java语言使用demo

    protobuf 使用详解

    详细介绍了protobuf 在程序中的使用方法

    Protobuf 快速指南中文版.pdf

    参照官网介绍及相关代码示例整理的谷歌Protobuf使用快速入门手册。 Protocol buffers 是谷歌用于序列化数据的方案,具有语言无关、平台无关、可扩展的机制 – 类似XML, 但更小、更快和更简单。一旦定义了数据的结构化...

    Protobuf使用小案例

    使用谷歌开源的Protobuf通信协议,可以动态的优化通信协议包,缩小包的长度,并进行安全加密传输。

    Protobuf使用

    解析程序中包含了Protobuf源文件文件和示例程序(多个协议存入一个缓存区)。程序未做任何处理,方便大家直接使用。 另有说明文档,方便新手使用。

    android protobuf 使用demo

    使用.proto 数据格式demo

    史上最详细的 ulua(tolua)的Protobuf安装配置

    (1) protobuf-net:项目使用的插件,就是从 protobuf-net-2.1.0-alpha-5/protobuf-net 直接拖入的 (2) WebPlayerTemplates/protobuf-net: 老版本的可用插件。因为新拖入的插件还没有完整测试过,这里保留一下老的 (3...

    protobuf3.13.0 vs2019 MSVC编译。 动态库,提供QTcreator写的demo。

    里面含有 protobuf3.13.0 用cmake MSVC 编译的动态链接库。 里面有debug,release 32位和64位的 lib,dll,exe. 包含一个简单的序列化 反序列化的Qt demo。

    在Unity中使用ProtoBuf

    在Unity中使用ProtoBuf的工具,使用protoc将写好的proto 3文件生成csharp使用的代码,在网络传输中用着再好不过了

    protobuf使用示例

    protobuf api详细序列化与反序列化示例代码

    protobuf基本操作1

    protobuf基本操作1

    Protobuf:Protobuf使用

    Protobuf 前言 protobuf,全称:Google Protocol Buffer,是Google开源的一种轻便高效的结构化数据存储格式,可以用于结构化数据的串行化,也称作序列化,主要用于数据存储或是RPC数据交换,支持多语言,可拓展。 ...

    protobuf使用案例

    这是一个protobuf入门级使用DEMO,google官方出的序列化和反序列化工具,其性能和字节数都JSON和XML高了不止一个等级,相信通过这个代码,你能很快上手protobuf的使用。

    proto文件中导入其他proto文件demo

    protobuf使用

    protobuf-2.6.1

    protobuf 使用protocexe方法

Global site tag (gtag.js) - Google Analytics