protocol buffer应用与原理

合集下载

pb协议原理

pb协议原理

pb协议原理PB(Protocol Buffer)协议原理概述PB(Protocol Buffer)是一种数据交换的编码格式,由Google公司开发。

它以二进制的形式存储和传输数据,具有高效、灵活和可扩展的特点。

本文将介绍PB协议的原理以及其在实际应用中的优势。

一、PB协议的基本原理1. 数据结构定义PB协议使用一种类似于结构体的方式来描述数据结构。

用户需要通过一个`.proto`文件来定义消息类型、字段和数据格式。

每个字段都有一个唯一的标识符和一个特定的数据类型。

2. 数据序列化PB协议将数据序列化为二进制格式进行存储和传输。

数据序列化可以分为编码和解码两个过程。

编码将结构化的数据转化为二进制流,解码则是将二进制流还原为结构化数据。

3. 数据压缩PB协议采用了Varint编码技术,将整数进行压缩存储。

Varint编码将一个整数分割成多个部分进行存储,每个部分的高位用于标识是否还有后续部分,低位则存储数值的具体内容。

这种编码方式可以有效减少存储空间。

4. 优势PB协议具有以下优势:- 数据存储紧凑:PB使用二进制格式存储数据,相比于XML和JSON等文本格式,存储空间占用更小。

- 数据解析高效:PB协议对于数据的序列化和反序列化效率非常高,可以快速地将结构化数据转化为二进制流。

- 数据兼容性强:PB协议支持字段的可选、必选和重复三种类型,可以方便地进行数据扩展和升级。

二、PB协议的应用场景1. 分布式系统通信在分布式系统中,不同节点之间需要进行数据交换和通信。

PB协议可以在不同的编程语言间进行数据传输,保证数据的一致性和准确性。

2. 数据存储和传输PB协议可以用于数据的存储和传输,例如在日志传输、网络通信、数据库存储等场景中,PB协议可以提高数据的传输效率和节省存储空间。

3. 应用接口定义PB协议可以用于定义应用程序之间的接口,确保数据传输的可靠性和一致性。

通过定义接口的消息类型和字段,不同系统之间可以进行数据的无缝对接。

C#使用ProtocolBuffer(ProtoBuf)进行Unity中的Socket通信

C#使用ProtocolBuffer(ProtoBuf)进行Unity中的Socket通信

C#使⽤ProtocolBuffer(ProtoBuf)进⾏Unity中的Socket通信⾸先来说⼀下本⽂中例⼦所要实现的功能:基于ProtoBuf序列化对象使⽤Socket实现时时通信数据包的编码和解码下⾯来看具体的步骤:⼀、Unity中使⽤ProtoBuf导⼊DLL到Unity中,创建⽹络传输的模型类:using System;using ProtoBuf;//添加特性,表⽰可以被ProtoBuf⼯具序列化[ProtoContract]public class NetModel {//添加特性,表⽰该字段可以被序列化,1可以理解为下标[ProtoMember(1)]public int ID;[ProtoMember(2)]public string Commit;[ProtoMember(3)]public string Message;}using System;using ProtoBuf;//添加特性,表⽰可以被ProtoBuf⼯具序列化[ProtoContract]public class NetModel {//添加特性,表⽰该字段可以被序列化,1可以理解为下标[ProtoMember(1)]public int ID;[ProtoMember(2)]public string Commit;[ProtoMember(3)]public string Message;}在Unity中添加测试脚本,介绍ProtoBuf⼯具的使⽤。

using System;using System.IO;public class Test : MonoBehaviour {void Start () {//创建对象NetModel item = new NetModel(){ID = 1, Commit = "LanOu", Message = "Unity"};//序列化对象byte[] temp = Serialize(item);//ProtoBuf的优势⼀:⼩Debug.Log(temp.Length);//反序列化为对象NetModel result = DeSerialize(temp);Debug.Log(result.Message);}// 将消息序列化为⼆进制的⽅法// < param name="model">要序列化的对象< /param>private byte[] Serialize(NetModel model){try {//涉及格式转换,需要⽤到流,将⼆进制序列化到流中using (MemoryStream ms = new MemoryStream()) {//使⽤ProtoBuf⼯具的序列化⽅法ProtoBuf.Serializer.Serialize<NetModel> (ms, model);//定义⼆级制数组,保存序列化后的结果byte[] result = new byte[ms.Length];//将流的位置设为0,起始点ms.Position = 0;//将流中的内容读取到⼆进制数组中ms.Read (result, 0, result.Length);return result;}} catch (Exception ex) {Debug.Log ("序列化失败: " + ex.ToString());return null;}}// 将收到的消息反序列化成对象// < returns>The serialize.< /returns>// < param name="msg">收到的消息.</param>private NetModel DeSerialize(byte[] msg){try {using (MemoryStream ms = new MemoryStream()) {//将消息写⼊流中ms.Write (msg, 0, msg.Length);//将流的位置归0ms.Position = 0;//使⽤⼯具反序列化对象NetModel result = ProtoBuf.Serializer.Deserialize<NetModel> (ms);return result;}} catch (Exception ex) {Debug.Log("反序列化失败: " + ex.ToString());return null;}}}using System;using System.IO;public class Test : MonoBehaviour {void Start () {//创建对象NetModel item = new NetModel(){ID = 1, Commit = "LanOu", Message = "Unity"}; //序列化对象byte[] temp = Serialize(item);//ProtoBuf的优势⼀:⼩Debug.Log(temp.Length);//反序列化为对象NetModel result = DeSerialize(temp);Debug.Log(result.Message);}// 将消息序列化为⼆进制的⽅法// < param name="model">要序列化的对象< /param>private byte[] Serialize(NetModel model){try {//涉及格式转换,需要⽤到流,将⼆进制序列化到流中using (MemoryStream ms = new MemoryStream()) {//使⽤ProtoBuf⼯具的序列化⽅法ProtoBuf.Serializer.Serialize<NetModel> (ms, model);//定义⼆级制数组,保存序列化后的结果byte[] result = new byte[ms.Length];//将流的位置设为0,起始点ms.Position = 0;//将流中的内容读取到⼆进制数组中ms.Read (result, 0, result.Length);return result;}} catch (Exception ex) {Debug.Log ("序列化失败: " + ex.ToString());return null;}}// 将收到的消息反序列化成对象// < returns>The serialize.< /returns>// < param name="msg">收到的消息.</param>private NetModel DeSerialize(byte[] msg){try {using (MemoryStream ms = new MemoryStream()) {//将消息写⼊流中ms.Write (msg, 0, msg.Length);//将流的位置归0ms.Position = 0;//使⽤⼯具反序列化对象NetModel result = ProtoBuf.Serializer.Deserialize<NetModel> (ms); return result;}} catch (Exception ex) {Debug.Log("反序列化失败: " + ex.ToString());return null;}}}⼆、Unity中使⽤Socket实现时时通信通信应该实现的功能:服务器可以时时监听多个客户端服务器可以时时监听某⼀个客户端消息服务器可以时时给某⼀个客户端发消息⾸先我们需要定义⼀个客户端对象using System;using .Sockets;// 表⽰⼀个客户端public class NetUserToken {//连接客户端的Socketpublic Socket socket;//⽤于存放接收数据public byte[] buffer;public NetUserToken(){buffer = new byte[1024];}// 接受消息// < param name="data">Data.< /param>public void Receive(byte[] data){UnityEngine.Debug.Log("接收到消息!");}// 发送消息//< param name="data">Data.< /param>public void Send(byte[] data){}}using System;using .Sockets;// 表⽰⼀个客户端public class NetUserToken {//连接客户端的Socketpublic Socket socket;//⽤于存放接收数据public byte[] buffer;public NetUserToken(){buffer = new byte[1024];}// 接受消息// < param name="data">Data.< /param>public void Receive(byte[] data){UnityEngine.Debug.Log("接收到消息!");}// 发送消息//< param name="data">Data.< /param>public void Send(byte[] data){}}然后实现我们的服务器代码using System.Collections;using System.Collections.Generic;using ;using System;using .Sockets;public class NetServer{//单例脚本public static readonly NetServer Instance = new NetServer();//定义tcp服务器private Socket server;private int maxClient = 10;//定义端⼝private int port = 35353;//⽤户池private Stack<NetUserToken> pools;private NetServer(){//初始化socketserver = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);server.Bind(new IPEndPoint(IPAddress.Any, port));}//开启服务器public void Start(){server.Listen(maxClient);UnityEngine.Debug.Log("Server OK!");//实例化客户端的⽤户池pools = new Stack<NetUserToken>(maxClient);for(int i = 0; i < maxClient; i++){NetUserToken usertoken = new NetUserToken();pools.Push(usertoken);}//可以异步接受客户端, BeginAccept函数的第⼀个参数是回调函数,当有客户端连接的时候⾃动调⽤ server.BeginAccept (AsyncAccept, null);}//回调函数,有客户端连接的时候会⾃动调⽤此⽅法private void AsyncAccept(IAsyncResult result){try {//结束监听,同时获取到客户端Socket client = server.EndAccept(result);UnityEngine.Debug.Log("有客户端连接");//来了⼀个客户端NetUserToken userToken = pools.Pop();userToken.socket = client;//客户端连接之后,可以接受客户端消息BeginReceive(userToken);//尾递归,再次监听是否还有其他客户端连⼊server.BeginAccept(AsyncAccept, null);} catch (Exception ex) {UnityEngine.Debug.Log(ex.ToString());}}//异步监听消息private void BeginReceive(NetUserToken userToken){try {//异步⽅法userToken.socket.BeginReceive(userToken.buffer, 0, userToken.buffer.Length, SocketFlags.None, EndReceive, userToken);} catch (Exception ex) {UnityEngine.Debug.Log(ex.ToString());}}//监听到消息之后调⽤的函数private void EndReceive(IAsyncResult result){try {//取出客户端NetUserToken userToken = result.AsyncState as NetUserToken;//获取消息的长度int len = userToken.socket.EndReceive(result);if(len > 0){byte[] data = new byte[len];Buffer.BlockCopy(userToken.buffer, 0, data, 0, len);//⽤户接受消息userToken.Receive(data);//尾递归,再次监听客户端消息BeginReceive(userToken);}} catch (Exception ex) {UnityEngine.Debug.Log(ex.ToString());}}}using System.Collections;using System.Collections.Generic;using ;using System;using .Sockets;public class NetServer{//单例脚本public static readonly NetServer Instance = new NetServer();//定义tcp服务器private Socket server;private int maxClient = 10;//定义端⼝private int port = 35353;//⽤户池private Stack<NetUserToken> pools;private NetServer(){//初始化socketserver = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);server.Bind(new IPEndPoint(IPAddress.Any, port));}//开启服务器public void Start(){server.Listen(maxClient);UnityEngine.Debug.Log("Server OK!");//实例化客户端的⽤户池pools = new Stack<NetUserToken>(maxClient);for(int i = 0; i < maxClient; i++){NetUserToken usertoken = new NetUserToken();pools.Push(usertoken);}//可以异步接受客户端, BeginAccept函数的第⼀个参数是回调函数,当有客户端连接的时候⾃动调⽤server.BeginAccept (AsyncAccept, null);}//回调函数,有客户端连接的时候会⾃动调⽤此⽅法private void AsyncAccept(IAsyncResult result){try {//结束监听,同时获取到客户端Socket client = server.EndAccept(result);UnityEngine.Debug.Log("有客户端连接");//来了⼀个客户端NetUserToken userToken = pools.Pop();userToken.socket = client;//客户端连接之后,可以接受客户端消息BeginReceive(userToken);//尾递归,再次监听是否还有其他客户端连⼊server.BeginAccept(AsyncAccept, null);} catch (Exception ex) {UnityEngine.Debug.Log(ex.ToString());}}//异步监听消息private void BeginReceive(NetUserToken userToken){try {//异步⽅法userToken.socket.BeginReceive(userToken.buffer, 0, userToken.buffer.Length, SocketFlags.None,EndReceive, userToken);} catch (Exception ex) {UnityEngine.Debug.Log(ex.ToString());}}//监听到消息之后调⽤的函数private void EndReceive(IAsyncResult result){try {//取出客户端NetUserToken userToken = result.AsyncState as NetUserToken;//获取消息的长度int len = userToken.socket.EndReceive(result);if(len > 0){byte[] data = new byte[len];Buffer.BlockCopy(userToken.buffer, 0, data, 0, len);//⽤户接受消息userToken.Receive(data);//尾递归,再次监听客户端消息BeginReceive(userToken);}} catch (Exception ex) {UnityEngine.Debug.Log(ex.ToString());}}}在Unity中开启服务器,并使⽤C#控制台模拟客户端连接、发送消息操作。

一看看懂ProtocolBuffer(协议篇)

一看看懂ProtocolBuffer(协议篇)

⼀看看懂ProtocolBuffer(协议篇)前⾔由于笔者业团队的业务对即时通讯服务有很⼤的依赖,春节结束后的第⼀天,红包没到,产品同学先到了,产品同学和我说要做⼀款IM,看到需求⽂档后和设计图后笔者⼤吃⼀⽄这不就是⼀个翻版的web qq吗?可以可以联想到最最近美团的⼤象,头条的Lark,⽤户与⽤户,商家与⽤户,企业同事的沟通,及其衍⽣的配套增值服务,真是需求旺盛的强需求啊如果我要做⼀个WebIM应⽤现在的Web应⽤通常会考虑ajax轮询或者是long polling的⽅式来实现,但是频繁的建⽴https连接,会带来多余请求和消息精准性的问题,本质上是TCP,消息边界不清晰,会有黏包的情况类似我司ios和andorid客户端,采⽤socket+PB协议来解决及时通讯问题,采⽤socket服务,依赖google的oc PB协议包来实现,socket是基于TCP协议,由通信协议和编程API组成的,原理⼀次HTTP协议握⼿成功后,与服务器建⽴双向连接,数据就可以直接从TCP 通道传输基于事件的⽅式,⼆级制传输,反编译为json或者xml笔者在查阅翻google PB开发者⽂档时,看到17年下半年google发布了官⽅的js的版本,配合websocket,可以与PB协议进⾏配合,在实现原理上,优于现有的ajax轮询或者是long polling的实现⽅式So,Let's rock !Protocol Buffer是个什么东东?Protocol Buffer是Google提供的⼀种数据序列化协议,下⾯是我从⽹上找到的Google官⽅对protobuf的定义:Protocol Buffers 是⼀种轻便⾼效的结构化数据存储格式,可以⽤于结构化数据序列化,很适合做数据存储或 RPC 数据交换格式。

它可⽤于通讯协议、数据存储等领域的语⾔⽆关、平台⽆关、可扩展的序列化结构数据格式。

为什么是Node,为何要和Protocol Buffer打交道?做为javascript开发者,对我们最好的数据序列化协议当然是JSON,pb协议相较于之前流⾏的XML更加的简洁⾼效pb属于⼆进制协议,更容易解析,解析速度⽐⽂本协议有⼆向箔级别的压制,so,在聊天场景下,udp传输明显是优于tcp的后台通信基本是基于⼆进制的,以往我们开发中⽤到的纯⽂本协议是后台同学在封装⼀层实现的,例如我司的服务,就维护了两套,⼀套⼆进制的,⼀套http接⼝的,如果可以⽤Node打通了pb,可以将维护成本降到最低,理论上只有⼀套底层⼆级制服务ps. 类似PB这样的东西,还有MessagePack和Apache Thrift说的这么热闹,⽼夫已经迫不及待了!想必你已经说,别逼逼,show me the code,怎么好的开发都么上进呢?好吧,Let's Rock & Roll!官⽅案例我们来操作⼀下安装google-protobuf2017年4⽉开始官⽅⽀持javascriptgithubdevelopsnpm install google1. -protobuf定义.proto⽂件proto⽂件 messages.proto1. package zxwj;2. syntax = "proto3";3. message helloworld4. {5. string zzuid = 123;6. string zzstatus = 0;7. }编译.proto⽂件使⽤protobuf.js命令⾏⼯具编译1. protoc --js_out=import_style=commonjs,binary:. messages.protoprotoc会编译输⼊⽂件,并且构建messages_pb,在sever中,可以以以下⽅式引⽤1. var messages = require('./messages_pb');2. var message = new messages.MyMessage();编写server.js1. var basepb = require('./messages_pb');2. console.log(basepb);3.4. var message = new basepb.SearchRequest();5. console.log(message);6.7. message.setName("TS");8. message.setPassword("123456");9.10. var bytes = message.serializeBinary(); //对象序列化11. console.log(bytes);12.13. var message2 = basepb.SearchRequest.deserializeBinary(bytes); //进制序列化14. console.log(message2);运⾏1. node sever.js总结⼀下上个案例并不具备线上产品能⼒,但是还可以能看出PB协议的优势所在快,从官⽅的测试结果来看,整体⽐較起來,ProtoBuf.js 則是⽐纯JSON 的处理快上⼀倍以上,附官⽅Github测试结果(机器配置:i7-2600K。

protobuf协议

protobuf协议

protobuf协议protobuf协议,即Protocol Buffers,是google开发的一种轻量级的数据交换格式,是一种语言无关、平台无关,简单,高效的结构化数据存储格式,可以被多次编码和解码,以节省计算资源。

1. protobuf协议介绍Protobuf,即Protocol Buffers,是Google开发的一种轻量级的数据交换格式,是一种语言无关、平台无关,简单,高效的结构化数据存储格式,可以被多次编码和解码,以节省计算资源。

Protobuf 可以用于非结构化的数据,如图像和声音,以及可以存储结构数据,如数据库记录、消息和文件,也可以用来定义接口,例如服务器/客户端之间的接口,通过调用它定义的接口,两端可以通过传输的数据进行交互。

Protobuf协议是高性能、高效的一种数据交换格式,它支持多种语言、多种系统间无缝交互,当数据量大时能够显著减少网络带宽。

Protobuf协议比传统的 XML式更加节省资源,使用 protobuf传输效率可以提升超过 20,且能大大提升服务器端处理效率。

2. protobuf协议优势a) 传输效率高Protobuf比几乎所有的技术都具有更快的传输效率,其合理的数据格式能够大大减少网络传输的数据量,执行序列化的消息传输效率,可以比 XML率快 10 20。

b)省带宽Protobuf议能有效地节省带宽,从而减少网络传输的流量以及降低了服务器端处理数据的负担。

c)言无关Protobuf在多种不同的语言中都很容易使用,可以在多种不同的平台使用,并可以在多种不同的系统之间无缝的交换数据,给用户提供更多的便利。

d)结构化数据支持由于protobuf是一种轻量级的数据交换格式,其可以用于非结构化的数据,如图片、声音,以及可以存储结构数据,如数据库记录、消息和文件。

3. protobuf协议在实践中的应用由于它具有上述优势,目前protobuf协议已经被应用在了很多行业,特别是在高性能计算机、移动互联网、云服务、音视频应用中,非常有用。

Golang使用ProtocolBuffer案例

Golang使用ProtocolBuffer案例

Golang使⽤ProtocolBuffer案例⽬录1. 前⾔⼯作⼏年了。

的编程语⾔从熟悉的Java,到喜欢的Kotlin,最后到⼀⾔难尽的Golang。

常⽤的数据交换格式也从xml到json,最后到现在的protobuf。

因为底层驱动对数据的采集⾮常频繁,⽽且对数据的可读性并没有太⾼的要求。

所以采⽤序列化体积更⼩、序列化和反序列化速度更快的protobuf。

考虑到后期还会继续深⼊使⽤protobuf,先插个眼,⽅便后期的使⽤和问题排查。

2. Protobuf 简介Google Protocol Buffer(简称 Protobuf) 是Google 旗下的⼀款轻便⾼效的结构化数据存储格式,平台⽆关、语⾔⽆关、可扩展,可⽤于通讯协议和数据存储等领域。

适合⽤做数据存储和作为不同应⽤,不同语⾔之间相互通信的数据交换格式。

2.1 Protobuf 优点1.⽀持多种语⾔、跨平台,多平台之间只需要维护⼀套proto协议⽂件(当然还需要对应的配置)。

2.序列化后是⼆进制流,体积⽐Json和Xml⼩,适合数据量较⼤的传输场景。

3.序列化和反序列化速度很快,据说⽐Json和Xml快20~100倍。

(本地测过,只有在数据达到⼀定量时才会有明显的差距)⼩结:适合传输数据量较⼤,对响应速度有要求的数据传输场景。

2.2 Protobuf 缺点1.序列化后的数据不具备可读性。

2.需要⼀定的额外开发成本(.proto 协议⽂件),每次修改都需要重新⽣成协议⽂件。

3.应⽤场景并没有Json和Xml⼴,相对于使⽤的⼯具也少。

⼩结:⾃解释性较差、通⽤性较差,不适合⽤于对基于⽂本的标记⽂档建模。

2.3 Protobuf Golang 安装使⽤step1:下载protobuf 编译器protoc。

step2:下载对应的⽂件。

Windows系统直接将解压后的protoc.exe放在GOPATH/bin⽬录下(该⽬录要放在环境变量中);Linux系统需要make编译。

protobuf使用方法

protobuf使用方法

protobuf使用方法protobuf(Protocol Buffers)是谷歌开源的一种轻便高效的数据交换格式,它能够将结构化数据序列化为二进制数据,支持多种语言,如C++、Java、Python等。

protobuf主要用于通信协议、数据存储等场景,能够提高数据交换和存储的效率。

本文将详细介绍protobuf的使用方法,包括定义消息结构、序列化和反序列化等。

一、定义消息结构在protobuf中,消息结构是由.proto文件定义的,它包含消息类型、字段名称和数据类型等信息。

下面是一个.proto文件的示例:```syntax = "proto3";package mypackage;message Person {string name = 1;int32 age = 2;repeated string phone_numbers = 3;}```以上.proto文件定义了一个名为Person的消息结构,它包含三个字段:name、age和phone_numbers。

其中name和phone_numbers是string类型,age是int32类型,而phone_numbers是一个可重复的字段,即可以包含多个值。

在.proto文件中,还可以定义枚举类型、服务等信息,具体可以参考protobuf官方文档。

二、生成代码定义完消息结构后,需要使用protobuf编译器将.proto文件编译成相应语言的代码。

protobuf编译器支持多种语言,如C++、Java、Python等。

以Java为例,执行以下命令可以将.proto文件编译成Java代码:```protoc --java_out=./java/. person.proto```其中--java_out=./java/.表示生成的Java代码存放在./java/目录下,person.proto是.proto文件的路径。

三、序列化和反序列化在Java中,可以使用protobuf提供的API来对消息进行序列化和反序列化。

buffer原理

buffer原理

buffer原理Buffer原理Buffer(缓冲区)是计算机与外部设备之间进行数据交换的中介,其本质是一块内存区域,用于临时存储数据,以提高数据处理效率。

在数据传输过程中,外设向计算机传输数据或计算机向外设传输数据时,数据会首先通过Buffer缓冲区进行存储,然后再按照指定规则进行处理或传输。

Buffer的原理基本上是围绕着缓存数据和分离速度两个方面展开的。

首先,Buffer的核心是缓存,在数据处理中,计算机往往需要进行大量的数据读取和写入操作,而这一过程涉及到的数据量通常较大,若每次读写都直接与外设交互,会造成系统资源的浪费与效率的低下,因此,Buffer的作用就是缓存数据,将大量的数据暂时存放在内存中,待处理的时候再从内存中进行读取和写入的操作。

其次,Buffer还可以分离速度,将在处理过程中的速度快慢不同的设备之间的数据往往存在速度上的不匹配。

为了保证数据的正常处理,Buffer会将数据的吞吐量和速度进行匹配,以达到设备之间传输数据的稳定和高效。

不同类型的Buffer在原理和用途上存在差异,通常区分为读缓存和写缓存。

读缓存主要用于外设向计算机传输数据,而写缓存则用于计算机向外设传输数据。

在实际应用中,我们一般会用到缓存池,即一组缓冲区的集合,它可以同时应对多个外设的数据输入和输出。

总结一下,Buffer的核心原理是存储、暂存和缓存数据,并分离数据处理速度的差异,以满足不同设备间数据的有效传输。

Buffer在计算机应用中,可以用于文件传输、内存管理、网络数据传输等领域,可以起到提高数据处理效率、稳定性和安全性的作用。

同时,值得注意的是,因为缓存的存在,一些数据很可能暂时不被处理,而被缓存在内存中,这也就使得数据的安全性和完整性受到威胁。

为了保障数据的安全性,我们常常需要将缓存中的数据定期进行备份,以应对可能的数据丢失和损坏情况。

综上所述,Buffer作为数据传输过程中非常重要的关键技术,它能够提高数据处理效率、稳定性和安全性,应用广泛。

protobuf原理简单总结

protobuf原理简单总结

protobuf原理简单总结
Protobuf是一种数据序列化格式,常用于数据存储、网络传输以及进程间通信等场景。

它的原理简单总结如下:
1. 定义数据结构:通过使用Protobuf的语言描述文件(.proto 文件),开发人员可以定义自己的数据结构和消息格式。

这些数据结构可以包含不同类型的字段,如整数、布尔值、字符串等。

2. 编译生成代码:根据定义的数据结构,使用Protobuf编译器将.proto文件生成对应的代码文件,这些代码文件可以用于序列化和反序列化数据。

3. 序列化与反序列化:在发送方,将要发送的数据对象按照定义的数据结构进行序列化,即将数据对象转换为字节流。

在接收方,将接收到的字节流按照定义的数据结构进行反序列化,即将字节流转换为数据对象。

4. 二进制编码:Protobuf使用二进制编码来表示数据,相比于文本格式的JSON和XML,二进制编码更加紧凑、高效。

它可以节省网络带宽和存储空间,并且序列化和反序列化的速度也更快。

5. 版本兼容性:Protobuf支持版本兼容性,在对数据结构进行修改后,仍然可以对旧版本的数据进行反序列化,只会忽略新增的字段或者使用默认值。

这种版本兼容性可以简化系统的升级和维护。

总之,Protobuf通过定义数据结构和生成对应的序列化和反序列化代码,实现了高效、紧凑的数据存储和传输。

它的二进制编码方式和版本兼容性使得它在很多场景下成为了首选的数据交换格式。

protocol buffer repeated类型

protocol buffer repeated类型

protocol buffer repeated类型摘要:1.介绍协议缓冲区(Protocol Buffer)2.介绍重复(repeated)类型3.解释重复类型的应用场景4.展示如何使用重复类型5.总结正文:一、介绍协议缓冲区(Protocol Buffer)协议缓冲区(Protocol Buffer)是一种轻便高效的结构化数据存储格式,可以用于序列化结构化数据。

它最初是由Google 开发,用于实现各种语言之间的数据交换。

如今,它已经成为了广泛使用的数据交换格式,特别是在分布式系统、网络通信和数据存储领域。

二、介绍重复(repeated)类型在协议缓冲区中,有一种特殊的数据类型,叫做“重复”(repeated)类型。

这种类型的特点是,它可以存储多个相同类型的数据。

在序列化时,它会将这些数据逐个存储,而在反序列化时,它会将这些数据还原为一个列表。

这种类型的应用场景包括:存储具有相同结构的多个数据项,以及节省存储空间。

三、解释重复类型的应用场景举个例子,假设我们需要存储多个用户的信息,每个用户的信息包括:用户名、密码、邮箱等。

如果我们使用传统的数据结构,比如结构体或者类,我们需要为每个用户创建一个对象,这样会导致内存浪费和性能下降。

而如果我们使用协议缓冲区的重复类型,我们可以将多个用户的信息存储为一个列表,从而节省内存和提高性能。

四、展示如何使用重复类型下面是一个使用协议缓冲区的重复类型的例子。

假设我们需要存储三个用户的信息:```syntax = "proto3";message User {string name = 1;string password = 2;string email = 3;}message Users {repeated User user = 1;}```在这个例子中,我们定义了一个名为“User”的消息类型,用于存储单个用户的信息。

然后,我们定义了一个名为“Users”的消息类型,它使用了重复类型“User”,用于存储多个用户的信息。

ProtocolBuffer在Android企业云通讯录中的应用

ProtocolBuffer在Android企业云通讯录中的应用
更新的模式以及方式是整个应用的核心环节 ,需要满足
密等方式 , 增加工作量的同时, 又使得编码 、 解析 的过程
更慢。而相对于 X L和 JO G ol M S N,og e的另外一项技术 Po bf roo Bfr ̄着数据量小 、 rou( o cl u e) t Pt f 解析快、 安全性较
’JO S N高效、 短小得多。虽然是二进制数据格式, 但并没有 因此而让使用变得复杂 , 开发人员通过按照一定的语法定
ebo.o bok r o定 义 的 分 组 名 路 径 生 成 一 个 j a文 件 pt a v Ebo.v, bokaa提供数据的编码 、 j 解码以及其他很多相关的
高等优点,这些优点都是移动互联 网现在非常需要的特
点. 也是企业云通讯录进行同步更新环节所需要的特点。 P t u 是 G ol公司开发的一种数据描述语言, r o f og ob e 广
传输数据量小、 时间耗费短、 安全性高等条件。
国 家 自 然 科 学 基 金 资 助 项 目 ( o 6 0 2 5 N . 1 0 19, N . 17 0 7,o 6 1 1 1 N . 1 20 1 N . 0 0 0 1 , 江 学 者 和 创 新 团 队 发 展 计 划 0 6 1 10 , o 6 9 2 5 ) 长 基 金 资 助 项 目 ( o R 14 , 家 科 技 重 大 专 项 “ 动 互 联 N .IT 0 9) 国 移
很轻松地调用相关方法来完成业务消息的编码与解析工 作。Po bf rou 库在效率 、 t 数据大小、 易用性上有着很好的性 能. 故而能在 Gol公司得到广泛应用。Gol og e og e已经将这 样一套框架开源发布,rou能够在更多的方面得到更 Po bf t

protocolbuf 结构

protocolbuf 结构

protocolbuf 结构Protocol Buffers,简称为ProtoBuf,是一种用于结构化数据序列化的语言无关、平台无关、可扩展的机制。

它由Google开发并于2008年开源发布,用于解决不同语言之间的数据交互问题。

ProtoBuf使用一种自定义的二进制格式来序列化数据,相比于XML和JSON等文本格式,ProtoBuf在数据存储和传输上更加紧凑、高效。

ProtoBuf定义了一种简单的语法,通过.proto文件来描述数据结构和消息类型。

然后,根据.proto文件生成对应的源代码,开发者可以在自己的项目中使用这些生成的代码来进行数据的序列化和反序列化操作。

ProtoBuf的语法非常简洁明了,它使用message来定义数据的结构,message可以包含不同类型的字段,如整型、浮点型、布尔型等。

每个字段都有一个唯一的标识符和一个数据类型。

通过这些字段,我们可以构建复杂的数据结构,并将其序列化为二进制数据。

ProtoBuf在各种应用场景中都有广泛的应用。

首先,它在分布式系统中扮演了重要的角色。

由于ProtoBuf的高效性和跨语言特性,它被广泛用于RPC(远程过程调用)框架中。

例如,Google的开源RPC框架gRPC就使用ProtoBuf作为默认的数据传输格式。

此外,ProtoBuf还被用于一些大规模分布式存储系统,如Google的Bigtable和Hadoop的HBase等。

ProtoBuf还可以用于持久化存储和数据交换。

通过将数据序列化为ProtoBuf格式,可以将其存储到硬盘或发送到网络中。

相比于文本格式,ProtoBuf的存储空间更小,传输速度更快。

因此,它在一些对性能要求较高的应用中得到了广泛的应用,如游戏开发、金融交易系统等。

ProtoBuf还具有良好的兼容性和扩展性。

当数据结构发生变化时,ProtoBuf可以通过版本控制来处理不同版本之间的兼容性问题。

在.proto文件中,可以指定字段的可选性(optional)、必选性(required)和重复性(repeated),以及字段的默认值。

protobuf的原理

protobuf的原理

Protobuf的原理一、概述P r ot ob uf(P ro to co l Bu ff er s)是一种由G oo gl e开发的高效的数据序列化格式。

它通过定义结构化的数据模式(me ss ag e),并使用二进制格式进行编码,实现了高效的数据传输和存储。

本文将介绍Pr o to bu f的原理,包括其数据结构、编码规则以及使用方式。

二、数据结构2.1消息定义在Pr ot ob uf中,所有的数据都是通过消息(m es sa ge)进行定义的。

消息是由一组字段(f i el d)组成的,每个字段都有一个唯一的字段号和一个数据类型。

消息可以嵌套定义,从而构成复杂的数据结构。

2.2数据类型P r ot ob uf提供了一些基本的数据类型,包括整型、浮点型、布尔型、字符串型等,同时也支持枚举类型和嵌套消息类型。

三、编码规则3.1V a r i n t编码在P ro to bu f中,整数类型使用V ar in t编码进行序列化。

Va r in t编码可以将一个整数压缩成可变长度的字节序列,使数据传输更加高效。

3.2二进制编码除了整数类型,P rot o bu f还支持对浮点型、布尔型、字符串型等数据类型进行二进制编码。

二进制编码采用固定长度的字节序列,可以减少存储空间和传输带宽的消耗。

四、使用方式4.1协议定义语言P r ot ob uf使用自定义的协议定义语言(P ro to co lD ef in it i on La ng ua ge,简称P ro to)进行消息的定义。

P r ot o提供了一种简洁、可读性高的语法,方便开发者定义和维护消息结构。

4.2代码生成通过Pr ot o文件定义好消息结构后,可以使用P ro to bu f提供的编译器将P r ot o文件编译生成对应的代码。

生成的代码可以用于数据的序列化、反序列化以及消息的访问和修改。

4.3数据传输和存储在实际应用中,可以使用Pr ot ob uf进行数据的传输和存储。

protobuf 协议

protobuf 协议

protobuf 协议Protobuf,即 Protocol Buffers缩写,是 Google司发明的一种数据结构序列化协议,可以将机器可理解的“结构化数据”转化为可存储,可传输,也可以从机器中重新恢复回来。

这种“结构化数据”可以是简单的数据类型,例如数字、字符串和布尔值,也可以是复杂的数据类型,如结构体类型和可嵌套的值。

于它,可以构建强大的数据信息交换体系,从而为运行在各种平台之上的应用程序之间提供数据通讯服务。

Protobuf前身是 Google一项名为“kme”的项目,它的目的是提供一种轻量级的数据交换格式,可以替代 XML JSON,从而改善在网络上传输大量数据时的性能问题。

Protobuf有以下特点:1. 体积小:Protobuf 使用二进制格式存储数据,协议格式几乎只有纯文本格式的四分之一,数据传输的体积小,占用的带宽也小,可以有效减少数据传输的时间;2.率高:Protobuf 使用预编译的技术,不需要在运行时做任何解析操作,可以提高数据的解析速度,大大减少 CPU耗;3.平台:Protobuf用了简洁的数据格式,它是由描述信息和数据结构的.proto件编译为不同语言的源代码,可以跨各种编程语言和操作系统,比如 Java、C++、Python;4.放标准:Protobuf一种开放标准,易于学习和使用,它提供了丰富的文档和示例,可以方便程序员们搭建自己的数据交换体系,从而极大提升程序开发效率;由于其高效的数据交换机制,Protobuf前已经成为许多高性能分布式系统的首选数据格式。

它在大数据系统、移动应用程序和云服务等多个领域都有着广泛的应用,并不断发展更多的用途。

Protobuf应用非常广泛,它可以用于分布式系统、云服务和移动应用之间的数据交换,也可以用于游戏系统中数据的传输。

例如在游戏中,可以使用 Protobuf玩家的数据存储在云端,从而实现玩家数据的存档管理和灾难恢复功能。

protocol buffer编码与解码 java代码实现

protocol buffer编码与解码 java代码实现

protocol buffer编码与解码java代码实现Protocol Buffer编码与解码Java代码实现Protocol Buffer是一种高效的序列化机制,可以用于将结构化数据进行编码和解码,以便在网络中传输或存储。

在本篇文章中,我们将详细介绍如何使用Java代码实现Protocol Buffer的编码和解码功能。

第一步:安装Protocol Buffer首先,我们需要安装Protocol Buffer编译器和Java插件。

可以通过前往Protocol Buffer官方网站(安装完成后,可以通过运行以下命令来验证安装是否成功:protoc version如果能够输出版本号,则表示安装成功。

第二步:定义消息结构在Protocol Buffer中,消息结构以.proto文件的形式定义。

我们可以使用文本编辑器创建一个新的.proto文件,然后定义我们的消息结构。

首先,让我们创建一个名为Person的消息类型,其中包含姓名和年龄字段。

可以将以下内容添加到.proto文件中:syntax = "proto3";message Person {string name = 1;int32 age = 2;}注意,我们使用proto3语法进行定义,并为每个字段指定了唯一的一个编号,这些编号将用于在编码和解码时标识字段。

第三步:编译.proto文件完成消息结构的定义之后,我们需要使用Protocol Buffer编译器将.proto 文件编译成Java代码。

打开命令行界面,切换到.proto文件所在的目录,并运行以下命令:protoc java_out=./ ./example.proto这里的"./example.proto"是我们的.proto文件路径,"java_out=./"表示编译结果将会保存到当前目录下。

执行成功后,将会生成一个名为example.proto的Java文件,其中包含生成的Java类用于表示我们定义的消息类型。

protobuf的拷贝机制

protobuf的拷贝机制

protobuf的拷贝机制【原创版】目录1.Protobuf 简介2.Protobuf 的拷贝机制原理3.Protobuf 拷贝机制的实现4.Protobuf 拷贝机制的优点和局限性正文【1.Protobuf 简介】Protobuf(Protocol Buffers)是一种轻便高效的结构化数据存储格式,可以用于序列化结构化数据。

它比 JSON 更快、更小、更安全。

Protobuf 是 Google 开发的一种数据交换格式,可以用于各种语言之间的数据通信。

【2.Protobuf 的拷贝机制原理】Protobuf 的拷贝机制主要是基于数据的序列化和反序列化实现的。

序列化是将数据结构转换为字节序列,反序列化是将字节序列转换为数据结构。

Protobuf 使用二进制形式表示数据,这使得其序列化和反序列化过程非常高效。

【3.Protobuf 拷贝机制的实现】Protobuf 的拷贝机制主要通过以下几个步骤实现:(1)定义数据结构:首先,需要定义待拷贝的数据结构的.proto 文件中。

(2)编译.proto 文件:使用 protobuf 编译器(protoc)将.proto 文件编译为目标语言的源代码文件。

(3)序列化数据:使用编译生成的源代码文件,将对象序列化为字节序列。

(4)拷贝字节序列:将序列化后的字节序列拷贝到目标对象。

(5)反序列化数据:使用目标对象的反序列化方法,将拷贝的字节序列反序列化为新的对象。

【4.Protobuf 拷贝机制的优点和局限性】Protobuf 的拷贝机制具有以下优点:(1)高效:Protobuf 使用二进制形式表示数据,其序列化和反序列化过程非常高效。

(2)可扩展:Protobuf 支持自定义数据类型,可以根据需求定义不同的数据结构。

(3)跨平台:Protobuf 支持多种编程语言,可以在不同的平台上实现数据交换。

然而,Protobuf 的拷贝机制也存在一定的局限性:(1)学习成本:虽然 Protobuf 的拷贝机制高效,但其学习成本相对较高,需要掌握.proto 文件的编写和 protobuf 编译器的使用。

protobuf和protostuff的原理

protobuf和protostuff的原理

protobuf和protostuff的原理
Protobuf和Protostuff是两个在软件开发领域中常用的序列化框架。

它们的主要原理是将结构化的数据转换为字节流,以便在不同的系统之间进行传输和存储。

Protobuf是由Google开发的一种语言无关、平台无关的序列化框架。

其原理是
通过定义一个数据结构的协议(即proto文件),然后使用特定的编译器将该协议
文件编译成目标语言(如Java、C++、Python等)所需的代码。

这些生成的代码可
以将数据从结构化的形式转换为字节流,并在需要时将其恢复回原始的数据结构。

Protobuf使用二进制编码,因此可以提供较小的数据大小和较快的序列化和反序列
化速度。

相比之下,Protostuff是一个基于Protobuf协议的序列化库。

它的原理与Protobuf类似,但更加简洁和高效。

Protostuff不需要在开发过程中定义proto文件,而是直接使用Java类进行序列化和反序列化操作。

这使得开发人员更加方便地使
用Protostuff进行数据转换。

与Protobuf一样,Protostuff也使用二进制编码,以实
现更小的数据传输大小和更快的处理速度。

无论是Protobuf还是Protostuff,它们的原理都是将结构化数据转换为字节流,并在需要时进行反序列化。

它们在性能和跨语言支持方面都具有优势,并在许多项目中被广泛应用。

选择使用哪种序列化框架取决于项目的需求和个人偏好。

无论是使用Protobuf还是Protostuff,开发人员都可以通过它们来实现高效、可靠的数据
传输和存储。

protobuf协议继承协议

protobuf协议继承协议

protobuf协议继承协议在软件开发中,数据的传输和存储是一个必不可少的环节。

为了实现高效、快速的数据传输和存储,开发者们设计了许多不同的数据序列化和反序列化协议。

其中一种被广泛应用的协议就是Google开发的protobuf(Protocol Buffers)。

protobuf是一种轻量级、高效的二进制数据序列化协议,可以将结构化的数据转换为字节流,从而实现数据的传输和存储。

与其他协议相比,protobuf具有以下几个优点:1. 高效性:protobuf使用二进制编码,相对于常见的文本协议(如XML和JSON),它的编码后的数据体积更小,传输速度更快。

2. 可扩展性:protobuf支持数据结构的版本和字段的添加、删除、重命名等操作,可以保持向前和向后兼容性。

3. 语言无关性:protobuf可以通过定义数据结构的.proto文件生成各种编程语言的代码,使得不同语言的应用程序可以无缝地交互。

4. 强类型:protobuf的编码和解码过程是强类型的,可以在编译时检查数据的合法性,减少运行时错误。

在protobuf中,协议的继承是一种重要的特性。

通过继承,可以实现数据结构的复用和扩展。

具体来说,protobuf中的继承分为单继承和多继承两种方式。

单继承是指一个消息类型可以继承自另一个消息类型,从而获得父类型的字段和方法。

在.proto文件中,使用关键字"extend"和"optional"来定义继承关系。

例如,定义一个父类型消息Person和一个子类型消息Student的.proto文件如下所示:```protobufmessage Person {string name = 1;int32 age = 2;}message Student {extend Person {optional int32 student_id = 3;}}```在这个例子中,Student消息类型继承自Person消息类型,并添加了一个额外的字段student_id。

grpc 协议实现原理

grpc 协议实现原理

grpc 协议实现原理gRPC(Google Remote Procedure Call)是一种高性能、开源的远程过程调用(RPC)框架,由Google开发。

它基于HTTP/2协议和Protocol Buffers(简称protobuf)序列化协议,并支持多种编程语言。

gRPC的实现原理可以分为以下几个方面。

1. 通信协议:gRPC使用HTTP/2作为底层的通信协议,相较于HTTP/1.x具有更低的延迟和更高的吞吐量。

HTTP/2的多路复用机制能够在一个TCP连接上同时发送多个请求和响应,避免了HTTP/1.x 中频繁建立和关闭连接的开销。

此外,HTTP/2还支持头部压缩和服务端推送等特性,进一步提升了性能。

2. 序列化协议:gRPC使用Protocol Buffers作为默认的序列化协议。

Protocol Buffers是一种轻量级的数据交换格式,能够高效地将结构化数据序列化为字节流。

相较于XML和JSON等文本格式,Protocol Buffers具有更小的数据体积、更快的编解码速度和更强的兼容性。

此外,Protocol Buffers还支持消息定义的版本化和扩展,使得系统的演化更加灵活。

3. 代码生成:gRPC使用Protocol Buffers的定义文件来描述服务接口和消息结构,并通过编译器生成相应的代码。

根据定义文件,gRPC编译器会自动生成服务端和客户端的代码框架,包括请求和响应消息的类、服务接口的抽象类和具体实现类等。

这样,开发人员只需要关注业务逻辑的实现,而无需手动编写繁琐的网络通信代码。

4. 服务定义:gRPC使用Protocol Buffers的语法来定义服务接口。

开发人员可以在定义文件中声明RPC方法的输入参数和返回值类型,并指定方法的名称和语义。

gRPC支持四种不同类型的RPC方法:普通RPC、服务器端流式RPC、客户端流式RPC和双向流式RPC。

通过这些不同类型的RPC方法,开发人员可以灵活地满足各种不同的业务需求。

jprotobuf原理

jprotobuf原理

jprotobuf原理
jprotobuf是一种基于GoogleProtocolBuffer协议的Java对象序列化和反序列化工具。

它的原理是将Java对象序列化为二进制数据,然后使用Protocol Buffer协议进行编码和解码。

在使用jprotobuf时,需要定义一个.proto文件,该文件定义了需要序列化的Java对象所对应的字段和类型。

然后使用jprotobuf 提供的插件将.proto文件编译为Java类,这些类实现了Protocol Buffer中定义的接口,可以通过jprotobuf进行序列化和反序列化。

jprotobuf支持的数据类型包括基本类型、数组、集合、枚举、嵌套对象等。

在序列化和反序列化过程中,jprotobuf使用了缓存和对象池等技术来提高性能。

jprotobuf还提供了一些高级特性,如自定义序列化、压缩和加密等。

通过这些特性,可以灵活地处理不同的序列化场景。

总的来说,jprotobuf是一种高效、灵活和易用的Java对象序列化和反序列化工具,可以广泛应用于分布式系统、RPC和缓存等场景。

- 1 -。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Palmcity Confidential
过程1-proto文件
proto 文件,定义程序中需要处理的结构化数据,在 protobuf 的术语中, 结构化数据被称为 Message。proto 文件非常类似 java 或者 C 语言 的数据定义。清单 1 显示了例子应用中的 proto 文件内容。 package lm; message helloworld { required int32 id = 1; // ID required string str = 2; // str optional int32 opt = 3; //optional field }
Palmcity Confidential
B.编译
执行命令 javac -d . -classpath .;protobuf-java-2.x.0.jar AddPerson.java ListPeople.java com\example\tutorial\AddressBookProtos.java
Protocol Buffer的应用与原理
周华彬 研发三部 2011.12
定义
protocol buffers是一个语言中立,平台中立 ,可扩展的序列化结构化数据的一种方式,可 用于通讯协议,数据存储等方面。二进制 与json和xml是同一个层次的东东 支持的语言Java,C++,Python三种
Palmcity Confidential
C++读取
linux安装protobuf
$unzip protobuf-2.3.0.zip $cd protobuf-2.3.0 $./configure && make &&make install $vi /etc/profile export LD_LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib export LD_RUN_PATH=$LD_LIBRARY_PATH export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig $protoc –I. –cpp_out. ./addressbook.proto $make cpp $./list_people_cpp addr.dat Addr.dat是windows下生成的数据文件,复制到linux后可直接读取。环境变量必须设置,否则编译会出错
序列化反序列化对比测试
Protobuf是较优化的,跨语言;可选jackson,解析json效率高; hessian支持rpc
Palmcity Confidential
Protocol buffer使用
1.下载资源
下载地址为:/p/protobuf/downloads/list下 载protoc-2.x.0-win32.zip 和 protobuf-2.x.0.zip,前者是 protocol buffer 编译器,后者包含了三种语言的开发包。首先解压 protoc-2.x.0-win32.zip,把 protoc.exe 文件放到该目录中。编译 生成的 protobuf-java-2.X.0.jar 复制到 proto_home\examples
Palmcity Confidential
原理之解析与串行化
每个ProtocolBuffer类有些方法用于读写消息的二进制数据( /apis/protocolbuffers/docs/encodi ng.html )。包括: · ParseFromIstream(istream* input) :从给定的C++ istream解析消息。
· SerializeToOstream(ostream* output) :将消息写入到给定的C++ ostream中。
他们是成对使用的,提供二进制数据的串行化和解析。
Palmcity Confidential
ProtocolBuffer与面向对象设计
ProtocolBuffer类只是用于存取数据的,类似于C++中的结构体, 他们并没有在面向对象方面做很好的设计。如果你想要给这些类添 加更多的行为,最好的方法是包装(wrap)。包装同样适合于复用别 人写好的 .proto 文件。这种情况下,你可以把ProtocolBuffer生 成类包装的很适合于你的应用,并隐藏一些数据和方法,暴露有用 的函数等等。 你不可以通过继承来给自动生成的类添加行为。 这 会破坏他们的内部工作机制。
Palmcity Confidential
Protocol buffer的优劣
比json和XML 1.简单; 2.小巧:3-10倍 3.效率高:20-100倍 4.跨语言 5.有ቤተ መጻሕፍቲ ባይዱ动工具生成访问类 不足 1.不适合描述符号文本 2. 不如XML易阅读和编辑 3.需要工具预先生成序列化类
Palmcity Confidential
2.使用
A.使 用 protocol buffer 编译器编译 addressbook.proto 文件。打开 命令行窗口,并定位到 proto_home\examples 目录中,运行命令 protoc --java_out=. addressbook.proto,执行这个命令后会在当 前目录下生成一个java类.
C.执行
运行 AddPerson,在命令中执行命令 java -cp .;protobuf-java2.X.0.jar AddPerson addr.dat,按照提示输入相应的信息,将保存到 addr.dat中
Palmcity Confidential
显示数据
执行命令w:\jdk6\bin\java -cp .;protobuf-java-2.3.0.j ar ListPeople addr.dat
Palmcity Confidential
更新proto文件时的规则
在新的proto文件中就要遵守如下规则:
对已存在的任何字段,你都不能更改其标识(tag)号。 你绝对不能添加或删除任何required的字段。 你可以添加新的optional或repeated的字段,但是你必须使 用新的标识(tag)号(例如,在这个protocol buffer中从 未使用过的标识号——甚至于已经被删除过的字段使用过的标 识号也不行)。
Palmcity Confidential
Palmcity Confidential
编译成-C++
protoc -I=. --cpp_out=. addressbook.proto
编译成-JAVA
protoc --java_out=. addressbook.proto
编译成-python
protoc --python_out=. addressbook.proto
相关文档
最新文档