数据序列化协议 Protocol Buffers(Protobuf) 认知

对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》

写在前面


  • 需要存大数据,同事推荐,了解一下
  • 理解不足小伙伴帮忙指正

对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》


Protocol Buffers(简称 Protobuf)是一种轻量级数据序列化协议,由 Google 开发。它可用于结构化数据的序列化,使得数据可以在不同平台、不同语言之间进行传输和存储。

Protobuf 使用一种类似于 XMLJSON结构化数据表示方式,但它的主要目标是提供更高效的数据序列化和传输。相比于 XML 和 JSON,Protobuf 在数据大小解析速度上都有显著的优势。

使用 Protobuf,您可以定义数据结构消息类型,并根据这些定义生成代码。生成的代码可用于在不同的编程语言中创建消息对象,并将数据序列化为字节流或从字节流中反序列化为消息对象。这使得在不同的系统和平台之间传输和共享数据变得更加简单和可靠。

Protobuf 提供了易于使用的语法来定义消息类型、字段和枚举,并支持可选、必需和重复字段。它还支持版本化、默认值、嵌套消息、扩展字段等高级特性,以满足复杂数据结构的需求。

实际需要

python 使用 Protocol Buffers 格式 保存人脸特征向量到数据库

定义消息结构

创建一个 .proto 文件(例如 vetor.proto)来定义人脸特征向量的消息结构。在该文件中,您可以定义一个消息类型,包含一个字段用于存储人脸特征向量的数据。

1
2
3
4
5
6
syntax = "proto3";

message FaceFeature {
repeated double vector = 1;
}

定义了一个名为 FaceFeature 的消息类型,它包含一个名为 vector 的字段,它是一个浮点数的数组,用于存储人脸特征向量的数据。

安装 protoc

http安装包获取: https://github.com/protocolbuffers/protobuf/releases/tag/v24.4

对应系统直接下载安装包就可以

官网地址: https://protobuf.dev/

命令行使用需要配置环境变量,不想配置就到 bin 目录下面执行

生成代码(当前为 windos 环境):使用 Protocol Buffers 编译器(protoc)将 .proto 文件编译为 Python 代码。执行以下命令将生成对应的 Python 代码:

1
2
PS C:\Users\liruilong\Documents\GitHub\face-apiserver> protoc --python_out=. .\vetor.proto
PS C:\Users\liruilong\Documents\GitHub\face-apiserver>

vetor_pb2.py 生成的 py 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: vetor.proto
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()




DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0bvetor.proto\"\x1d\n\x0b\x46\x61\x63\x65\x46\x65\x61ture\x12\x0e\n\x06vector\x18\x01 \x03(\x01\x62\x06proto3')

_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'vetor_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
_globals['_FACEFEATURE']._serialized_start=15
_globals['_FACEFEATURE']._serialized_end=44
# @@protoc_insertion_point(module_scope)


使用

项目中使用,序列化,反序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import vetor_pb2

# 创建人脸特征向量消息
face_vector = vetor_pb2.FaceFeature()
face_vector.vector.extend(
[
0.003303239354863763,
-0.0026432510931044817,
0.05674311891198158,
...........................
-0.010262751951813698,
-0.018300455063581467,
0.05859880894422531,
0.01962246000766754,
0.00643733749166131,
-0.06724971532821655,
-0.04105524718761444
]
) # 填充人脸特征向量数据

# 序列化消息为字节串
serialized_data = face_vector.SerializeToString()
print(serialized_data)
print("Protobuf: ", serialized_data.__sizeof__())



# 反序列话
deserialized_vector = vetor_pb2.FaceFeature()
deserialized_vector.ParseFromString(serialized_data)
deserialized_data = deserialized_vector.vector
print(deserialized_data)

博文部分内容参考

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知,这是一个开源项目,如果你认可它,不要吝啬星星哦 :)


https://github.com/protocolbuffers/protobuf/releases/tag/v24.4

https://protobuf.dev/


© 2018-至今 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

发布于

2023-10-16

更新于

2024-11-22

许可协议

评论
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×