zoukankan      html  css  js  c++  java
  • Protobuf 安装及 Python、C# 示例

    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:GLTest2017 --python_out=E:GLTest2017 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 = 20
    person.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'
    x06xe5xbcxa0xe4xb8x89x10x14x18x01'
    Name: 张三; Age: 20; Marriage: True

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

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

    3.3 C# 示例

    C# 下的 Protobuf 有 3 个版本:

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

    在 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 01
    Name: 张三, Age: 20, Marriage: True

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

  • 相关阅读:
    盒子模型2+浮动
    盒子模型
    CSS背景和精灵图
    线程间的通信的实现
    操作系统中线程与进程
    java中的互斥锁和信号量的区别
    Java中的常见异常
    JVM面试问题
    软件测试分类
    软件测试
  • 原文地址:https://www.cnblogs.com/gl1573/p/11495941.html
Copyright © 2011-2022 走看看