栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

初识ProtoBuf(3.18.1)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

初识ProtoBuf(3.18.1)

一、ProtoBuf介绍

Protocol Buffers(又名 protobuf)是谷歌的语言无关、平台无关、可扩展的结构化数据序列化机制。他是Google 的数据交换格式,可用于网络通讯和数据存储。

Protobuf通过定义数据的结构,然后使用protoc工具生成的源代码(包括C#、java、C++、Python等),方便实现在各种语言中数据流的读取。

官方提供了如何使用 protobuf 的开发人员的教程:
https://developers.google.com/protocol-buffers/docs/tutorials

示例:https://github.com/protocolbuffers/protobuf/blob/master/examples

Protocol Buffers 的完整文档可通过以下网址获得:
https://developers.google.com/protocol-buffers/

二、protoc编译器

协议编译器是用 C++ 编写的,我们可以直接下载编译后的exe。

github上网址:https://github.com/protocolbuffers/protobuf

编译完成版本:https://github.com/protocolbuffers/protobuf/releases

protoc 64为下载地址:protoc-3.18.1-win64.zip
完整版下载地址:protobuf-all-3.18.1.zip

解压后bin目录下:protoc.exe可以根据定义的结构体,直接生成各语言的代码。

// 输出c#代码
protoc --csharp_out=./ telegram.proto   

// 输出java代码
protoc --java_out=./ telegram.proto
三、.proto文件

protobuf 需要定义一个数据结构的描述文件,用来说明数据的内容。

如下,是官网的一个例子:

syntax = "proto3"; // proto3 必须加此注解

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
  enum Corpus {
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }
  Corpus corpus = 4;
}

上面是定义的一个message。包含:
String 类型的 query,编号是 1
int 类型的 page_number,编号是 2
枚举类型的 corpus

四、C#、java使用

简单使用如下:

C#例子

	// 定义对象,复制
     Telegram data = new Telegram ();
     data.UserCode = 76157;
     data.Status = RunStaus.Loaded;
	// 计算大小
     int size = data.CalculateSize();
     Console.WriteLine(size);
     
    // 输出对象到文件
	FileStream fso = new FileStream("test.data", FileMode.Create);
    data.WriteTo(fso );
    fsfso Close();

	// 读取文件生成对象
    FileStream fsi = new FileStream("test.data", FileMode.Open);
    Telegram data2 = new Telegram ();
    data2.MergeFrom(fsi );
    fsi .Close();

Java例子

	Telegram data= Telegram.newBuilder().setUserCode(1).setStatus(RunStaus.Loaded);
	// 输出对象到为Byte数组
	for(byte byte : data.toByteArray()){
	    System.out.println(byte);
	}

	// 转化Byte数组为对象
	Telegram data2= null;
	try {
	    data2= Telegram.parseFrom(data.toByteArray());
	} catch (InvalidProtocolBufferException e) {
	    e.printStackTrace();
	}
	System.out.println(data2.toString());
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/331831.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号