热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

protobuf安装_protobuf详解

protobuf详解一、什么是protobufprotobuf全称GoogleProtocolBuffers,是google开发的的一套用于数据存储,网络通信时用于协议编解码的工具

protobuf详解

beda46cc515062cfb071dd3ed4a28f4e.gif

一、什么是protobuf

protobuf全称Google Protocol Buffers,是google开发的的一套用于数据存储,网络通信时用于协议编解码的工具库。protobuf是一种灵活高效的独立于语言平台的结构化数据表示方法。在通信协议和数据存储等领域中使用比较多。protobuf对于结构中的每个成员会提供set系列函数和get系列函数。与XML相比,protoBuf更小更快更简单。你可以用定义protobuf的数据结构。用protobuf编译器生成特定语言的源代码,如C++,Java,Python等。

二、protobuf的优缺点

(1)优点:

      平台无关、语言无关

      二进制、数据字描述

      提供了完整详细的操作API

      高性能比XML要快20-100倍

      尺寸小比XML要小3-10倍高可扩展性

      数据字描述前后兼容

(2)缺点:

      语言覆盖度低,官方支持java、c++、python语言环境

      自定义protobuf的工作量偏大

三、protobuf的安装

1、源码编译安装

官方源码:https://github.com/google/protobuf

 (1) 安装依赖

如官网所列,protoc有如下依赖:Autoconf,automake,libtool,curl,make,g++,unzip,gmock。其中gmock依赖于libtool。

 (2) 源码下载

4a165bb3479e71e4b8e41afd7ecd8baf.png(3) 源码编译

3761754d8101f19adac144bdb9884d6c.png注:安装完成后会在/usr/lib目录下生成libprotobuf、libprotobuf-lite,libproto这三类静态和动态库文件。然后我们需要手动执行Idconfig来更新lib路径。

2、二进制安装

我们也可以直接下载二进制包来进行安装。

获取proto二进制文件的连接:https://github.com/protocolbuffers/protobuf/releases

(1) 下载指定版本的二进制包

(2) 解压指定PATH路径

即可安装完成。

四、使用示例

官方文档地址:https://developers.google.com/protocol-buffers/

安装完成后,我们可以按照官方手册上的示例编写.proto文件

(1) 编写.proto文件

4d8e396550d1882926076e4a0012e421.png

(2) 编译.proto文件,生成对应语言的操作文件。

    如果我们想要python的操作文件,那么执行:

protoc --python_out=./ test_pb.proto对应生成test_pb.py的文件。

    如果我们想要c++的操作文件,那么执行:protoc --cpp_out=./ test_pb.proto

对应生成test_pb.h test_pb.cc文件

(3) 序列化protobuf

将生成的操作文件引入到代码中。通过protobuf内置的set函数进行赋值,赋值完成后将protobuf序列化成二进制流。目前针对于c++语言,protobuf提供了如下序列化函数:

192490ccc52b194d1a9151dabd71d73e.png

(4) 反序列化protobuf

将已经序列化的二进制流反序列化,同样也是调用protobuf提供的内置函数。针对于c++,protobuf提供了如下几种常用的反序列化函数:

09f550cb28fb94fea2777bff7d821ea8.png

总结

一、 protobuf时间效率和空间效率都要比json和XML都有提升,但是由于消息结构可读性不高,且支持java,c++和python,导致其使用不够广泛。

二、 protobuf主要应用于对时间效率或空间效率方面有极高要求的场景。


推荐阅读
  • 在Linux系统上构建Web服务器的详细步骤
    本文详细介绍了如何在Linux系统上搭建Web服务器的过程,包括安装Apache、PHP和MySQL等关键组件,以及遇到的一些常见问题及其解决方案。 ... [详细]
  • 利用YAML配置Resilience4J的Circuit Breaker
    本文探讨了Resilience4j作为现代Java应用程序中不可或缺的容错工具,特别介绍了如何通过YAML文件配置Circuit Breaker以提高服务的弹性和稳定性。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • 本文详细介绍了如何正确安装Java EE SDK,并解决在安装过程中可能遇到的问题,特别是关于servlet代码在Apache Tomcat 10中无法运行的情况。 ... [详细]
  • 本文探讨了在QT框架中如何有效遍历文件内容,并解决了一个常见的错误,即文件内容读取为空时弹窗无法正常显示的问题。 ... [详细]
  • 本文深入探讨了JavaScript中实现继承的四种常见方法,包括原型链继承、构造函数继承、组合继承和寄生组合继承。对于正在学习或从事Web前端开发的技术人员来说,理解这些继承模式对于提高代码质量和维护性至关重要。 ... [详细]
  • 本文详细介绍了 Kubernetes 集群管理工具 kubectl 的基本使用方法,涵盖了一系列常用的命令及其应用场景,旨在帮助初学者快速掌握 kubectl 的基本操作。 ... [详细]
  • 本文探讨了使用Java创建高效且可靠的基准测试的方法,强调了选择合适的工具和理解潜在影响因素的重要性。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文详细介绍了如何在Java中使用org.apache.xalan.templates.AVTPartSimple类,并提供了多个实际的代码示例,帮助开发者更好地理解和运用这一类。 ... [详细]
  • Java中String类为何设计为final?其不可变性与其他包装类的特性
    探讨Java中String类设计为final的原因及其不可变性,同时分析其他基本数据类型包装类及枚举类型的不可变性。 ... [详细]
  • 本文介绍了两种在Android设备上获取MAC地址的有效方法,包括通过Wi-Fi连接和使用移动数据流量的情况。第一种方法依赖于Wi-Fi连接来获取MAC地址,而第二种方法则无需Wi-Fi,直接通过网络接口获取。 ... [详细]
  • 本文总结了WebSphere应用服务器出现宕机问题的解决方法,重点讨论了关键参数的调整,包括数据源连接池、线程池设置以及JVM堆大小等,旨在提升系统的稳定性和性能。 ... [详细]
  • 本文介绍了两种使用Java发送短信的方法:利用第三方平台的HTTP请求和通过硬件设备短信猫。重点讲解了如何通过Java代码配置和使用短信猫发送短信的过程,包括必要的编码转换、串口操作及短信发送的核心逻辑。 ... [详细]
author-avatar
王晓宁smile
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有