01| 简介02| 安装2.1 Windows 下安装03| 简单使用3.1 编译3.2 Python 示例3.3 C# 示例

01| 简介

Protobuf(Protocol Buffers),是 Google 开发的一种跨语言、跨平台的可扩展机制,用于序列化结构化数据。

与 XML 和 JSON 格式相比,protobuf 更小、更快、更便捷。protobuf 目前支持 C++、Java、Python、Objective-C,如果使用 proto3,还支持 C#、Ruby、Go、PHP、JavaScript 等语言。

官网地址:https://developers.google.cn/protocol-buffers/

GitHub 地址:https://github.com/protocolbuffers/protobuf

优点:

  • 性能好
  • 跨语言

缺点:

  • 二进制格式可读性差:为了提高性能,protobuf 采用了二进制格式进行编码,这直接导致了可读性差。
  • 缺乏自描述:XML 是自描述的,而 protobuf 不是,不配合定义的结构体是看不出来什么作用的。

02| 安装

2.1 Windows 下安装

下载地址:https://github.com/protocolbuffers/protobuf/releases

下载 protoc-3.9.1-win64.zip,这个是编译后的压缩包,相当于绿色版,解压后,将其下的 bin 目录添加到环境变量就可以了,省去了安装的麻烦。

然后打开命令提示符,输入命令:

protoc --version

成功显示版本号,则表示安装成功。如下图:

03| 简单使用

3.1 编译

使用 protobuf 首先需要定义 .proto 文件,先来看一个简单的例子。

定义 Person.proto 文件,内容如下:

syntax = "proto3";package Test;

message Person {  string Name = 1;  int32 Age = 2;  bool Marriage = 3;}
  • syntax = "proto3"; 指定正在使用 proto3 语法,否则 protobuf 将默认使用的是 proto2。
  • package Test; 指定命名空间(C# 中)。
  • message 是关键字,定义结构化数据。
  • 等号后面的数字是字段唯一编号(注意不是字段的值),用于二进制格式消息中标识字段。

protoc 是 protobuf 自带的编译器,可以将 .proto 文件编译成 java、python、go、C# 等多种语言的代码,直接引用。

编译命令:

protoc -I=E:\GL\Test2017 --python_out=E:\GL\Test2017 Person.proto

编译命令说明:

  • -I 表示源文件(.proto 文件)所在文件夹路径。
  • --python_out 表示目标语言为 python,且指定生成的 .py 文件存放目录。相应的,C# 为 csharp_out,
  • Person.proto 为源文件文件名,如果有多个,空格隔开。

3.2 Python 示例

安装 protobuf

调用编译命令编译 Person.proto,编译后生成文件:Person_pb2.py,添加至项目中,序列化和反序列化示例如下:

import Person_pb2

person = Person_pb2.Person()person.Name = '张三'person.Age = 20person.Marriage = True

# 序列化b = person.SerializeToString()print(b)

# 反序列化p = Person_pb2.Person()p.ParseFromString(b)print(f'Name: {p.Name}; Age: {p.Age}; Marriage: {p.Marriage}')

输出:

b'\n\x06\xe5\xbc\xa0\xe4\xb8\x89\x10\x14\x18\x01'Name: 张三; Age: 20; Marriage: True

注意,不能这样写,这是错误的:

p = Person_pb2.Person().ParseFromString(b)

3.3 C# 示例

C# 下的 Protobuf 有 3 个版本:

  • Google.ProtoBuf:Google官方版本,https://github.com/google/protobuf/tree/master/csharp
  • protobuf-net:.net 社区版本,由 .net 社区爱好者开发,https://github.com/mgravell/protobuf-net
  • Google.ProtocolBuffers:据说是由谷歌的 .net 员工在官方版本还未出来的时候开发的,https://github.com/jskeet/protobuf-csharp-port

这里我们介绍谷歌官方版本。

在 VS 中,通过 NuGet 安装 'google.protobuf' 包。

using Google.Protobuf;using System;using Test;

namespace Protobuf{    class Program    {        static void Main(string[] args)        {            Person person = new Person();            person.Name = "张三";            person.Age = 20;            person.Marriage = true;

            // 序列化            byte[] buffer = person.ToByteArray();

            foreach (byte b in buffer)            {                Console.Write(b.ToString("X2") + " ");            }            Console.WriteLine();

            // 反序列化            Person p = Person.Parser.ParseFrom(buffer);

            Console.WriteLine(string.Format("Name: {0}, Age: {1}, Marriage: {2}", p.Name, p.Age, p.Marriage));

            Console.Read();        }    }}

输出:

0A 06 E5 BC A0 E4 B8 89 10 14 18 01Name: 张三, Age: 20, Marriage: True

比较一下 Python 的输出,好像不一样,Python 中第一个字节是 \n,而这里是 0A。\n 在 ASCII 中的值就是 0A。所以两种语言的序列化结果是一样的。

转载于:https://www.cnblogs.com/gl1573/p/11495941.html

Protobuf 安装及 Python、C# 示例相关推荐

  1. google protobuf安装与使用

    google protobuf是一个灵活的.高效的用于序列化数据的协议.相比较XML和JSON格式,protobuf更小.更快.更便捷.google protobuf是跨语言的,并且自带了一个编译器( ...

  2. [转]google protobuf安装与使用

    google protobuf是一个灵活的.高效的用于序列化数据的协议.相比较XML和JSON格式,protobuf更小.更快.更便捷.google protobuf是跨语言的,并且自带了一个编译器( ...

  3. python3里的pillow怎么安装_“python安装pillow教程“python3.4怎么安装pil

    "python安装pillow教程"python3.4怎么安装pil python安装pillow教程2020-10-09 03:37:02人已围观 如何在python3.6中装p ...

  4. 如何获取本地安装的Python模块列表?

    我想获得Python模块的列表,这些模块在我的Python安装(UNIX服务器)中. 如何获得计算机中安装的Python模块的列表? #1楼 使用pkgutil.iter_modules非常简单的搜索 ...

  5. python安装库-python 安装库

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 安装插件使用命令 pip install opencv-python下载 ...

  6. 安装完python后怎么使用-python安装后怎么启用

    用于Windows的Python启动器是一个实用程序,可帮助定位和执行不同的Python版本.它允许脚本(或命令行)指示特定Python版本的首选项,并将定位并执行该版本. 与 PATH 变量不同,启 ...

  7. NVIDIA Jetson Xavier NX中安装的python库包的版本

    文章目录: 1 导出Jetson NX中已经安装的python库包 2 sicpy库包安装 1 导出Jetson NX中已经安装的python库包 1.导出Jetson NX中已经安装的库包版本 pi ...

  8. python连接数据库示例(东西写得很详细,剽过来了)

    原文链接:http://tech.it168.com/a2009/1014/759/000000759444.shtml [ IT168 技术文档]本文将向读者详细介绍如何利用DB-API模块方便地开 ...

  9. 《Pyflink》Flink集群安装,Python+Flink调研

    Flink集群安装,Python+Flink调研 Flink集群部署 下载对应版本安装包:https://flink.apache.org/downloads.html 实验环境为hadoop2.7, ...

最新文章

  1. 专访微软全球资深副总裁:中国AI正在爆发式崛起,千万不要复制美国,要建立自己的模式,才能做领导者
  2. 承载千万级并发的分布式系统架构设计思想
  3. 博弈论66个经典例子_「百大管理学定律」博弈论Game Theory
  4. 不平等博弈问题学习记录(一)(超实数篇)
  5. Docker基本组成 和 基本命令
  6. python 合并word文件,在Python上的WordCloud中,我想合并两种语言
  7. android4.2 音频模块启动分析,Android 音频模块学习小结
  8. [转]学习object-c,补习一下指针
  9. python第三天学习总结
  10. Codeforces 61B【怪在读题】
  11. linux c程序hello,Linux下实现c语言hello world 步骤
  12. java包名命名规则_告别编码5分钟,命名2小时!史上最全的Java命名规范参考!
  13. UG中许多人会忽略的一些常用鼠标右键设置方法
  14. 数领科技|solidworks教程:如何打包solidworks工程文件
  15. 计算机电源再利用usb充电器,变废为宝,笔记本旧电源改造的8口USB充电器
  16. 蚂蚁区块链使用搭建方法
  17. gerrit 用法 topic
  18. 为什么先序/中序线索二叉树不需要栈的支持,而后序线索二叉树需要栈的支持?
  19. 日有所思,夜有所梦:考研数学答卷有感
  20. “心脏出血”漏洞可导致密码泄露

热门文章

  1. 字符串中不重复字符出现第一次的位置
  2. JS代理模式《JavaScript设计模式与开发实践》阅读笔记
  3. 快来看看Google出品的Protocol Buffer,别仅仅会用Json和XML了
  4. 《可穿戴创意设计:技术与时尚的融合》一一第2章 与可穿戴设备有关的故事...
  5. 用C++写一个简单的服务器和客户端
  6. 数据结构快速回顾——栈
  7. 什么样的技术人员更容易接到软件开发项目?(论干私活儿)
  8. 小凡模拟器使用视频(续)
  9. 优化算法-共轭梯度法
  10. ImportError cannot import name BytesIO when import caffe