首页 > 其他分享 >数据序列化协议 Protocol Buffers(Protobuf) 认知

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

时间:2023-10-26 11:05:35浏览次数:36  
标签:Protocol Protobuf 特征向量 vector vetor 序列化 protobuf


写在前面


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

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


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

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

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

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

实际需要

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

定义消息结构

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

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 代码:

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 代码

# -*- 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)

使用

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

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)

博文部分内容参考

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

标签:Protocol,Protobuf,特征向量,vector,vetor,序列化,protobuf
From: https://blog.51cto.com/liruilong/8030962

相关文章

  • Java基础 序列化流和反序列化流的 三个使用细节
    细节一:如果说一个类实现了Serializable接口,表示这个类的对象是可被序列化的,Java底层会根据这个类里面所有的内容进行计算,计算出一个long类型的序列号(或版本号)。假设计算出来的版本号是1,当我创建了一个这个类的对象的时候,在对象里面就包含了版本号1,用序列化流写到本地文......
  • Java基础 序列化流、反序列化流
     序列化流是高级流,也是用来包装基本流的序列化流属于字节流的一种,负责输出数据;反序列化流负责输入数据 序列化流可以把Java中的对象写到本地文件中。但是写到文件中的数据我们看不懂,可以通过反序列化流把数据正确读取出来序列化流也叫对象操作输出流  序列......
  • 序列化与反序列化
    一、什么是序列化与反序列化?Java序列化是指把Java对象转换为字节序列的过程;Java反序列化是指把字节序列恢复为Java对象的过程;二、为什么要用序列化与反序列化?在 为什么要用序列化与反序列化 之前我们先了解一下对象序列化的两种用途:把对象的字节序列永久地保存到硬......
  • C++算法:二叉树的序列化与反序列化
    #题目序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列/反序列化算法执行逻......
  • C#对没有规律的json字符串转化为对象序列化并遍历读取
    varjsonString={"BillDate":1,"TypeName":0,"StepNum":0,"CollectCode":0,"Uncollected":1,"Tax":0,"AbstractInfo":1}现在我们要对这它进行转化并遍历读取:///<summary>///把json字符串转化为对象//......
  • C#序列化和反序列化JSON的两种方法(转载)(三)
    C#有两种方式序列化和反序列化JSON字符串:第一种是System.Web.Script.Serialization下的JavaScriptSerializer,原生自带的这种方法需要与类绑定,不方便。第二种是Json.NET第三方库方法,既可以与对象绑定,也可以反序列化为更通用的JObject,方便易用,推荐。一:  JavaScript......
  • 项目中JSON序列化循环引用的问题
    已经很多次碰到循环引用的问题了之前碰到是在Spring中初始化过程中component之间存在循环引用怎么办 这次碰到,是在JSON序列话的时候碰到了循环引用导致的问题问题原因:在结构体中,为了实现方便数据的引用,在数据结构中加入了Parent节点,由于存在child节点,在生成json对象的时候就......
  • IO流,对象流,将对象序列化到文件中,将对象反序列化到内存中
    一一一、序列化!!一、首先创建一个对象类,实现Serializable标记接口 对象中,实现了接口,三个私有属性,并且创建了无参有参构造,get和set方法和toString方法 (一个标准的对象模型)二、序列化到外部文件 结果: 也是一堆乱码,还是因为用字节输出的原因。 二二二、反序列化! 结......
  • TLS Handshake failed: tls: server selected unsupported protocol version 301
    2023/10/2321:04:55D:/Dev/sre/gormSQLServer/main.go:20[error]failedtoinitializedatabase,goterrorTLSHandshakefailed:tls:serverselectedunsupportedprotocolversion301TLSHandshakefailed:tls:serverselectedunsupportedprotocolversion30......
  • 序列化
    ###Serializer#models.pyfromdjango.dbimportmodelsclassRole(models.Model):title=models.CharField(verbose_name="标题",max_length=32)order=models.IntegerField(verbose_name="顺序")#views.pyfromdjango.dbimportmode......