protobuf介绍和使用

  1. 概念和版本
  2. 嵌入式C/C++如何使用
  3. 如何制作文件和协议

一、介绍

1.1 介绍

Protocol Buffers(简称为ProtoBuf)是一种用于序列化结构化数据的语言无关、平台无关、可扩展的机制。ProtoBuf是由Google开发的一种数据序列化格式,用于在不同的系统和语言之间进行数据交换。它具有以下特点:

  1. 语言无关性:ProtoBuf支持多种编程语言,包括C++、Java、Python、Go等,这使得不同语言的应用程序可以使用相同的数据结构进行通信。

  2. 紧凑性:ProtoBuf使用二进制编码,相比于文本格式(如XML、JSON),它的数据表示更加紧凑,占用更少的存储空间和网络带宽。

  3. 可扩展性:ProtoBuf的数据结构可以进行版本控制和演化,新的字段可以添加到已有的消息中,而不会破坏已有的解析代码。

  4. 速度高效:由于数据的紧凑表示和高效的解析算法,ProtoBuf在序列化和反序列化过程中具有较高的性能。

使用ProtoBuf,你可以定义消息的结构和字段类型,并使用相应的编译器将其转换为特定语言的类,以便进行数据的序列化和反序列化操作。这使得在不同的应用程序之间传输和存储结构化数据变得更加简单和可靠。

总体而言,ProtoBuf提供了一种简洁、高效、可扩展的数据序列化机制,适用于跨平台、跨语言的数据交换和存储需求。


协议缓冲区是一种与语言无关、与平台无关的可扩展机制,用于序列化结构化数据。
https://developers.google.cn/protocol-buffers

protobuf的核心内容包括:

  • 定义消息:消息的结构体,以message标识。
  • 定义接口:接口路径和参数,以service标识。

通过protobuf提供的机制,服务端与服务端之间只需要关注接口方法名(service)和参数(message)即可通信,而不需关注繁琐的链路协议和字段解析,极大降低了服务端的设计开发成本

1.2 版本

Protobuf(Protocol Buffers)有多个版本,每个版本都有一些不同之处。以下是几个常见的Protobuf版本及其区别:

  1. Protobuf v2:这是最早发布的版本,也是最广泛使用的版本。它使用.proto文件定义数据结构和消息格式,并提供了一种跨平台、跨语言的数据交换格式。Protobuf v2支持Java、C++、Python等多种编程语言。

  2. Protobuf v3:这是最新的Protobuf版本,它在语法和功能上与v2相比有一些变化。主要的改进包括更简洁的语法、更好的默认值支持、更强大的扩展性和更好的错误处理机制。Protobuf v3还引入了一些新的特性,例如Any类型和Map类型。

  3. gRPC:gRPC是一个基于Protobuf的高性能RPC(远程过程调用)框架。它使用Protobuf作为其默认的序列化和通信协议,并提供了自动生成的客户端和服务器代码。gRPC支持多种编程语言,并提供了强大的功能,如双向流、流式处理和身份验证。

  4. Proto3 JSON Mapping:这是一个附加的Protobuf扩展,允许将Protobuf消息直接转换为JSON格式。它提供了一种方便的方式来在Protobuf和JSON之间进行互操作。

总的来说,不同版本的Protobuf在语法、功能和性能方面会有一些差异。选择适合的版本取决于你的特定需求和项目要求。

二、嵌入式C/C++如何使用

对方提供协议和.proto文件的情况下,我们需要:

  1. 将.proto文件生成.h和.c代码。
  2. 将.h和.c代码集成到工程,并按协议调用相关接口。
  3. 如果我们提供协议:要制定协议和制作.proto文件。

2.1 C++ 使用protobuf

linux x64 编译和使用

./autogen.sh
./configure  --prefix=$PWD/install_x64
make -j4
make install

# test (已提前备好.proto文件)
./bin/protoc ./proto-file-test/* --cpp_out=./proto-file-test/
./bin/protoc ./proto-file-test/* --java_out=./proto-file-test

linux arm32 交叉编译和使用

./autogen.sh
./configure -h # 查看帮助手册,需要配置几个环境变量

# 方式一 : 先配置source环境变量
./configure --prefix=$PWD/install_O1 --host=arm-fslc-linux-gnueabi

# 方式二:
./configure --prefix=$PWD/install_O1 --host=arm-linux CC="arm-fslc-linux-gnueabi-gcc  -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi" CXX="arm-fslc-linux-gnueabi-g++  -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi" CFLAGS="-g -fPIC"  CXXFLAGS="-g -fPIC"

# 编译和安装
make -j4
make install

# 将.proto生成代码可以在x64环境下操作

# 嵌入式工程要用交叉编译的lib库和头文件
libprotobuf.so
libprotoc.so

在这里插入图片描述

默认环境变量:

myOpensource/protobuf-3.20.x$ print
print                        printenv                     printf                       printfilterpipelinesvc.exe   printticketvalidation.dll    printui.exe
print.exe                    printerbanner                printfilterpipelineprxy.dll  printmanagement.msc          printui.dll
mayue@PC-MAYUE:/mnt/d/hik/myOpensource/protobuf-3.20.x$ printe
printenv       printerbanner
mayue@PC-MAYUE:/mnt/d/hik/myOpensource/protobuf-3.20.x$ printenv
SHELL=/bin/bash
WSL_DISTRO_NAME=Ubuntu-20.04
NAME=PC-MAYUE
PWD=/mnt/d/hik/myOpensource/protobuf-3.20.x
LOGNAME=mayue
MOTD_SHOWN=update-motd
HOME=/home/mayue
LANG=C.UTF-8
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
LESSCLOSE=/usr/bin/lesspipe %s %s
TERM=xterm-256color
LESSOPEN=| /usr/bin/lesspipe %s
USER=mayue
DISPLAY=127.0.0.1:0.0
SHLVL=1
WSLENV=
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
PATH=/usr/bin:/home/mayue/.local/bin:/opt/arm-gcc/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin:/opt/fslc-x11/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/bin/arm-fslc-linux-gnueabi:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Users/mayue/AppData/Roaming/MobaXterm/slash/bin:/mnt/c/WINDOWS/:/mnt/c/WINDOWS/system32/:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/Program Files (x86)/VRV/CEMS:/mnt/c/Program Files/爱数 AnyShare Express:/mnt/c/Program Files/nodejs/:/mnt/c/Program Files/TortoiseGit/bin:/mnt/c/Program Files/Git/cmd:/mnt/d/Program Files (x86)/DscConfigTool:/mnt/c/Program Files (x86)/Windows Kits/8.1/Windows Performance Toolkit/:/mnt/c/Program Files/Microsoft SQL Server/110/Tools/Binn/:/mnt/c/Program Files/IDM Computer Solutions/UltraEdit:/mnt/c/Program Files/IDM Computer Solutions/UltraCompare:/mnt/c/Users/mayue/AppData/Local/Programs/Python/Python311:/mnt/c/Strawberry/c/bin:/mnt/c/Strawberry/perl/site/bin:/mnt/c/Strawberry/perl/bin:/mnt/e/Program Files (x86)/NetSarang/Xshell 7/:/mnt/c/Users/mayue/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/mayue/AppData/Roaming/npm:/mnt/c/Users/mayue/AppData/Local/Programs/Microsoft VS Code/bin:/mnt/d/Qt/Qt5.9.0/Tools/mingw530_32/bin:/mnt/c/Users/mayue/AppData/Local/Programs/Python/Python311:/mnt/c/Users/mayue/AppData/Local/Programs/Python/Python311/Scripts:/mnt/c/Users/mayue/AppData/Local/Programs/Python/Python311/Lib/site-packages:/mnt/d/Program Files/JetBrains/PyCharm Community Edition 2022.3.1/bin:/mnt/d/Qt/Qt5.7.1/5.7/msvc2013/bin:/mnt/c/Program Files (x86)/Nmap:/mnt/c/WINDOWS/sysnative/:/snap/bin
HOSTTYPE=x86_64
OLDPWD=/home/mayue
_=/usr/bin/printenv

重新配置环境变量

myOpensource/protobuf-3.20.x$ source /opt/fslc-framebuffer/2.4.4/environment-setup-armv7at2hf-neon-fslc-linux-gnueabi
myOpensource/protobuf-3.20.x$ printenv
SHELL=/bin/bash
M4=m4
WSL_DISTRO_NAME=Ubuntu-20.04
OECORE_SDK_VERSION=2.4.4
PKG_CONFIG_PATH=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi/usr/lib/pkgconfig:/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi/usr/share/pkgconfig
GDB=arm-fslc-linux-gnueabi-gdb
SDKTARGETSYSROOT=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
CPP=arm-fslc-linux-gnueabi-gcc -E  -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
TARGET_PREFIX=arm-fslc-linux-gnueabi-
NAME=PC-MAYUE
PWD=/mnt/d/hik/myOpensource/protobuf-3.20.x
LOGNAME=mayue
CXX=arm-fslc-linux-gnueabi-g++  -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
CXXFLAGS= -O2 -pipe -g -feliminate-unused-debug-types
OECORE_NATIVE_SYSROOT=/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux
MOTD_SHOWN=update-motd
LDFLAGS=-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed
HOME=/home/mayue
LANG=C.UTF-8
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
KCFLAGS=--sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
OECORE_TARGET_SYSROOT=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
CPPFLAGS=
LD=arm-fslc-linux-gnueabi-ld  --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
LESSCLOSE=/usr/bin/lesspipe %s %s
TERM=xterm-256color
LESSOPEN=| /usr/bin/lesspipe %s
USER=mayue
AR=arm-fslc-linux-gnueabi-ar
ARCH=arm
AS=arm-fslc-linux-gnueabi-as
DISPLAY=127.0.0.1:0.0
SHLVL=1
NM=arm-fslc-linux-gnueabi-nm
OECORE_DISTRO_VERSION=2.4
PKG_CONFIG_SYSROOT_DIR=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
OECORE_ACLOCAL_OPTS=-I /opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/share/aclocal
OBJCOPY=arm-fslc-linux-gnueabi-objcopy
WSLENV=
STRIP=arm-fslc-linux-gnueabi-strip
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
OBJDUMP=arm-fslc-linux-gnueabi-objdump
CONFIG_SITE=/opt/fslc-framebuffer/2.4.4/site-config-armv7at2hf-neon-fslc-linux-gnueabi
PATH=/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/bin:/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/sbin:/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/bin:/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/sbin:/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/bin/../x86_64-fslcsdk-linux/bin:/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/bin/arm-fslc-linux-gnueabi:/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/bin/arm-fslc-linux-musl:/usr/bin:/home/mayue/.local/bin:/opt/arm-gcc/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin:/opt/fslc-x11/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/bin/arm-fslc-linux-gnueabi:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Users/mayue/AppData/Roaming/MobaXterm/slash/bin:/mnt/c/WINDOWS/:/mnt/c/WINDOWS/system32/:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/Program Files (x86)/VRV/CEMS:/mnt/c/Program Files/爱数 AnyShare Express:/mnt/c/Program Files/nodejs/:/mnt/c/Program Files/TortoiseGit/bin:/mnt/c/Program Files/Git/cmd:/mnt/d/Program Files (x86)/DscConfigTool:/mnt/c/Program Files (x86)/Windows Kits/8.1/Windows Performance Toolkit/:/mnt/c/Program Files/Microsoft SQL Server/110/Tools/Binn/:/mnt/c/Program Files/IDM Computer Solutions/UltraEdit:/mnt/c/Program Files/IDM Computer Solutions/UltraCompare:/mnt/c/Users/mayue/AppData/Local/Programs/Python/Python311:/mnt/c/Strawberry/c/bin:/mnt/c/Strawberry/perl/site/bin:/mnt/c/Strawberry/perl/bin:/mnt/e/Program Files (x86)/NetSarang/Xshell 7/:/mnt/c/Users/mayue/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/mayue/AppData/Roaming/npm:/mnt/c/Users/mayue/AppData/Local/Programs/Microsoft VS Code/bin:/mnt/d/Qt/Qt5.9.0/Tools/mingw530_32/bin:/mnt/c/Users/mayue/AppData/Local/Programs/Python/Python311:/mnt/c/Users/mayue/AppData/Local/Programs/Python/Python311/Scripts:/mnt/c/Users/mayue/AppData/Local/Programs/Python/Python311/Lib/site-packages:/mnt/d/Program Files/JetBrains/PyCharm Community Edition 2022.3.1/bin:/mnt/d/Qt/Qt5.7.1/5.7/msvc2013/bin:/mnt/c/Program Files (x86)/Nmap:/mnt/c/WINDOWS/sysnative/:/snap/bin
CC=arm-fslc-linux-gnueabi-gcc  -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
CFLAGS= -O2 -pipe -g -feliminate-unused-debug-types
CROSS_COMPILE=arm-fslc-linux-gnueabi-
HOSTTYPE=x86_64
CONFIGURE_FLAGS=--target=arm-fslc-linux-gnueabi --host=arm-fslc-linux-gnueabi --build=x86_64-linux --with-libtool-sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
RANLIB=arm-fslc-linux-gnueabi-ranlib
OLDPWD=/home/mayue
_=/usr/bin/printenv

2.2 C 使用protobuf

谷歌的protobuf支持很多种语言,唯独不支持c,而在嵌入式设备上大都是c语言开发,有很大的需求,

由此出现了很多非官方的支持c语言版ptotobuf。一直在更新的好像就nanopb和protobuf-c。

linux x64 编译

# 依赖上面编译好的protobuf的pkgconfig文件
export PKG_CONFIG_PATH=/mnt/d/hik/myOpensource/protobuf-3.20.x/install_x64/lib/pkgconfig

# 配置生成makefile
./configure --prefix=$PWD/install_x64

# 编译和安装
make -j4 && make install

# 测试(已提前备好.proto文件)
./bin/protoc-c ./proto-file-test/* --c_out=./

linux arm32 编译

# 依赖上面编译好的protobuf的pkgconfig文件
export PKG_CONFIG_PATH=/mnt/d/hik/myOpensource/protobuf-3.20.x/install_O1/lib/pkgconfig

# 注意依赖x64环境下的可执行文件protoc,所以要替换install_O1/bin目录下的protoc文件

# 配置生成makefile
./configure --prefix=$PWD/install_O1 --host=arm-linux CC="arm-fslc-linux-gnueabi-gcc  -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi" CXX="arm-fslc-linux-gnueabi-g++  -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi" CFLAGS="-g -fPIC"  CXXFLAGS="-g -fPIC"

# 编译和安装
make -j4 && make install

# 测试(已提前备好.proto文件)
./bin/protoc-c ./proto-file-test/* --c_out=./

三、语法格式和编辑工具

3.1 语法格式

3.2 编辑工具

内容:编辑、序列化、反序列化、转JSON

  1. vscode + 插件
  2. 在线工具
  3. Protobuf在线解码工具推荐
  4. protobuf在线反序列化工具

3.3 语法校验

四、参考资料

五、protobuf 存在的问题

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Google Protobuf 是一种用于序列化结构化数据的开源协议,可以用于数据交换和存储。在 Protobuf 中,extend 关键字用于向现有的消息类型添加额外的字段或注释,而插件则是一种用于自动生成代码的工具,可以根据 Protobuf 文件生成各种编程语言的代码。 使用 extend 关键字向消息类型添加字段非常简单,只需要在消息定义文件中使用 extend 关键字定义一个扩展点,然后在需要使用该扩展点的消息类型中引用即可。例如: ``` extend MyMessage { optional int32 my_field = 1001; } message OtherMessage { extend MyMessage { optional int32 my_field = 1001; } } ``` 这里我们向消息类型 MyMessage 中添加了一个名为 my_field 的字段,并在另一个消息类型 OtherMessage 中引用了该扩展点。 编写 Protobuf 插件需要使用 Protobuf 提供的插件 API,该 API 可以让我们在 Protobuf 文件被编译时自动执行一些操作,比如生成代码或者其他的自定义处理。具体的插件编写方法可以参考 Protobuf 官方文档,这里简单介绍一下插件的编写流程: 1. 编写插件的主要逻辑代码,可以使用任何编程语言,只需要能够调用 Protobuf 提供的插件 API 即可。 2. 使用 Protobuf 提供的 protoc 工具编译插件代码,并将生成的可执行文件放置在 PATH 环境变量中。 3. 在编写 Protobuf 文件时,使用 --plugin 参数指定要使用的插件,并使用 --plugin_out 参数指定插件的输出目录和参数,例如: ``` protoc --plugin=protoc-gen-myplugin --myplugin_out=output_dir=my_output_param:. myfile.proto ``` 这里我们指定了插件的名称为 protoc-gen-myplugin,插件的输出目录为 my_output_param,并将 myfile.proto 作为输入文件进行编译。插件会在编译时自动被调用,并将生成的代码输出到 my_output_param 目录中。 以上就是使用 extend 和编写 Protobuf 插件的基本流程,具体的细节可以参考 Protobuf 官方文档和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值