首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Protobuf字节字段中保存数据`None`?

在Protobuf字节字段中保存数据None的方法是使用Protobuf的oneof关键字。oneof关键字允许在一个消息中定义多个字段,但只能有一个字段被设置为非空值。

具体步骤如下:

  1. 在Protobuf消息定义中,使用oneof关键字定义一个none_value字段,该字段可以保存None值。
代码语言:txt
复制
message MyMessage {
  oneof data {
    int32 integer_value = 1;
    string string_value = 2;
    bool boolean_value = 3;
    bytes bytes_value = 4;
    // 添加以下字段
    google.protobuf.NullValue none_value = 5;
  }
}
  1. 在使用Protobuf编码时,如果要将字段设置为None,则将none_value字段设置为google.protobuf.NullValue.NULL_VALUE
代码语言:txt
复制
from google.protobuf import null_value_pb2

my_message = MyMessage()
my_message.none_value = null_value_pb2.NULL_VALUE
  1. 在使用Protobuf解码时,可以通过检查none_value字段是否设置为google.protobuf.NullValue.NULL_VALUE来判断字段是否为None
代码语言:txt
复制
if my_message.none_value == null_value_pb2.NULL_VALUE:
  # 字段为None
else:
  # 字段有值

这样,就可以在Protobuf字节字段中保存数据None了。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何使用Protobuf进行数据交换【Programming(Go)】

那么,什么推荐返回到 Protobuf 这样的二进制编码系统呢? 考虑负的十进制值 -128。 在补码二进制表示,这个值可以存储在一个单独的8位字节: 10000000。...在每个字段行的末尾,作为字符串,是描述Protobuf类型的元数据,提供Protobuf IDL文档的数字标记并提供有关JSON信息的元数据,这些信息将在后面讨论。...代码所示,三个Marshal函数的每个函数都返回一个字节数组,然后将其写入文件。 (为简单起见,错误将被忽略。)...但是,Protobuf 标记, NumPair 字段的 int32值,使用 varint 编码,因此字节长度不同; 特别是,小整数值(包括标记,在本例)需要少于4个字节来进行编码。...pair.xml 103MB 15% 总而言之,修改后的numPairs程序的字段值小于2048,可减少原始数据每个整数值的四字节大小。

1.5K00

IM通讯协议专题学习(六):手把手教你如何在Android上从零使用Protobuf

《IM通讯协议专题学习(六):手把手教你如何在Android上从零使用Protobuf》(* 本文)《IM通讯协议专题学习(七):手把手教你如何在NodeJS从零使用Protobuf》《IM通讯协议专题学习...基本数据类型默认值:图片6.3消息类型定义----在上面创建的 Protobuf 文件,定义一个学生,学生有姓名,年龄,邮箱和课程。...)1-15 的字段编号只占一个字节进行编码,16-2047 的字段编号占两个字节,包括字段编号和字段类型,因此建议更多的使用 1-15 的字段编号;4)可以指定最小字段编号为 1,最大字段编号为 2^29...7、Protobuf 转 Java 文件----首先我们要明白一点:Protobuf 是一种与平台,语言无关的数据存储格式,因此我们要在其它语言:Java,Kotlin,Dart 等语言中使用它,则必须将...[4] 如何选择即时通讯应用的数据传输格式[5] 强列建议将Protobuf作为你的即时通讯应用数据传输格式[6] APP与后台通信数据格式的演进:从文本协议到二进制协议[7] 面试必考,史上最通俗大小端字节序详解

3K60
  • IM通讯协议专题学习(十):初识 Thrift 序列化协议

    2、系列文章 本文是系列文章的第 10 篇,本系列总目录如下: 《IM通讯协议专题学习(一):Protobuf从入门到精通,一篇就够!》...《IM通讯协议专题学习(六):手把手教你如何在Android上从零使用Protobuf》 《IM通讯协议专题学习(七):手把手教你如何在NodeJS从零使用Protobuf》 《IM通讯协议专题学习(...具体是: 1)field_type:字段类型,包括 String、I64、Struct、Stop 等; 2)fied_id:字段序号,解码时通过序号确定字段; 3)len:字段长度,用于变长类型, String...1 代表后面的字节还是属于当前数据,0 代表这是当前数据的最后一个字节。...[2] 如何选择即时通讯应用的数据传输格式 [3] 强列建议将Protobuf作为你的即时通讯应用数据传输格式 [4] APP与后台通信数据格式的演进:从文本协议到二进制协议 [5] 面试必考,史上最通俗大小端字节序详解

    18700

    IM通讯协议专题学习(八):金蝶随手记团队的Protobuf应用实践(原理篇)

    1、引言跟移动端IM追求数据传输效率、网络流量消耗等需求一样,随手记客户端与服务端交互的过程,对部分数据的传输大小和效率也有较高的要求,普通的数据格式 JSON 或者 XML 已经不能满足,因此决定采用...《IM通讯协议专题学习(六):手把手教你如何在Android上从零使用Protobuf》(稍后发布..)...《IM通讯协议专题学习(七):手把手教你如何在NodeJS从零使用Protobuf》《IM通讯协议专题学习(八):金蝶随手记团队的Protobuf应用实践(原理篇)》(* 本文)《IM通讯协议专题学习...进行编码,得到的二进制数据仅有20个字节:0a046a6f 6a6f1001 1a0a3132 33407171 2e636f6d4、编码原理相对于基于纯文本的数据结构 JSON、XML等,Protobuf...每种类型的序号可以从这张表得到:需要注意,对于string类型的数据(在上表第三行),由于其长度是不定的,所以 T-V的消息结构是不能满足的,需要增加一个标识长度的Length字段,即T-L-V结构。

    62720

    IM通讯协议专题学习(三):由浅入深,从根上理解Protobuf的编解码原理

    本篇文章我们不讨论IM系统的那些高端技术话题,我们回归到通讯的本质——也就是数据在网络交互时的编解码原理,并由浅入深从底层理解Protobuf的编解码技术实现。...《IM通讯协议专题学习(六):手把手教你如何在Android上从零使用Protobuf》(稍后发布..)...《IM通讯协议专题学习(七):手把手教你如何在NodeJS从零使用Protobuf》(稍后发布..)...但对于后端服务之间的交互(或者具体IM里Client和Server之间的交互)来说就不一样了,后端服务之间的RPC调用可能会传输大量数据,如果全部用纯文本的形式来表示数据那么不管是网络带宽还是性能可能都会差强人意...10、Protobuf的嵌套数据 与JSON和XML类似,Protobuf也支持嵌套消息.

    48840

    嵌入式linux之go语言开发(七)protobuf的使用

    我下载的是protoc-3.4.0-win32.zip protobuf的简单使用: 先编写*.proto定义文件test.proto: 在这个文件可以定义需要的结构, 例如枚举型, 结构体等等....source=drh》 [Protobuf序列化原理] 1、Protobuf序列化 Protobuf对于数据存储的三大原则: (1)Protocol Buffer将消息的每个字段进行编码后,利用T...(2)ProtoBuf对于不同数据类型采用不同的序列化方式(数据编码方式与数据存储方式) Protobuf对于不同的字段类型采用不同的编码和数据存储方式对消息字段进行序列化,以确保得到高效紧凑的数据压缩...不同类型的数据采用的编码方式和存储方式如下: 对于Varint编码数据的存储,不需要存储字节长度Length,使用T-V存储方式进行存储;对于采用其它编码方式(LENGTH_DELIMITED)的数据...或 repeated 字段没有被设置字段值,那么该字段在序列化时的数据是完全不存在的,即不需要进行编码,但相应的字段在解码时会被设置为默认值。

    1.1K20

    Python Protobuf入门

    Protobuf独立于语言、平台,同时也易于阅读和理解。这里将以一个例子介绍如何在Python中使用Protobuf。1.安装protobuf首先,需要安装了protobuf库。...在这个例子,定义了一个名为Person的消息,它有三个字段:name、age和email。...protobuf_data.ClearField("field_name")HasField(field_name)检查 Protobuf 对象的指定字段是否已设置protobuf_data.HasField...这样保存下来的文件大概是这样:图片但是Protobuf 序列化后的数据是二进制格式,通常无法直接以文本形式展示(或者看起来很奇怪)。...因此将二进制数据转换为 Base64 编码的字符串是一种常见的做法, Base64 编码后的字符串可以在文本协议(电子邮件、JSON、XML等)传输和存储。

    2.5K132

    数据序列化工具Protobuf编码&避坑指南

    缺乏一些数据类型:例如没有内建的日期、时间类型,对于这些类型的数据,需要手动转换成可以支持的类型, string 或 int。...: 对于 tag 来说,它保存了 message 字段的编号以及类型信息,我们可以做个实验,把 name 这个 tag 编码后的二进制打印出来: func main() { student := student.Student...最佳实践 字段编号 需要注意的是范围 1 到 15 字段编号需要一个字节进行编码,包括字段编号和字段类型;范围 16 至 2047 字段编号需要两个字节。...因为使用了 VarInts,所以单字节的最高位是零,而最低三位表示类型,所以只剩下 4 位可用了。也就是说,当你的字段数量超过 16 时,就需要用两个以上的字节表示了。...如果在序列化或者反序列化的过程,该字段没有被设置,那么 protobuf 库就会抛出一个错误。

    1.1K20

    配图清新的Protobuf 编码&避坑指南

    我们现在所有的协议、配置、数据库的表达都是以 protobuf 来进行承载的,所以我想深入总结一下 protobuf 这个协议,以免踩坑。...缺乏一些数据类型:例如没有内建的日期、时间类型,对于这些类型的数据,需要手动转换成可以支持的类型,string或int。...: 图片 对于 tag 来说,它保存了message 字段的编号以及类型信息,我们可以做个实验,把 name 这个tag编码后的二进制打印出来: func main() { student := student.Student...最佳实践 字段编号 需要注意的是范围 1 到 15 字段编号需要一个字节进行编码,包括字段编号和字段类型;范围 16 至 2047 字段编号需要两个字节。...如果在序列化或者反序列化的过程,该字段没有被设置,那么protobuf库就会抛出一个错误。

    1.1K00

    使用Wireshark分析gRPC消息

    ,允许你做以下操作: 加载相关的.proto文件 为字节或字符串类型的协议缓冲区字段注册自己的子解剖器 捕获gRPC流量 这篇文章的重点是分析捕获的gRPC消息。...如果需要了解如何在捕获文件中保存网络流量,请参见《Wireshark用户指南》[5]的捕获实时网络数据[6]。 请注意 目前,Wireshark只能解析gRPC纯文本消息。...在Packet-list面板中选择一个条目,Wireshark将对其进行解码,并在下方面板显示其详细信息,如下所示: ? 从详细信息窗格中选择一个条目,查看与该条目对应的字节序列: ?...例如,要学习如何注册portrait_image字段的PNG解码器,请参阅Protobuf字段子解剖器[14]。...v3.2.0:改进了基于.proto文件对序列化协议缓冲区数据的解析,并且支持流式RPC。 v3.3.0:改进和增强了.proto文件支持,例如对协议缓冲区字段值的捕获文件搜索。

    6.3K10

    ProtoBuf 入门详解

    1.定义数据结构:首先,开发者使用.proto文件来定义数据结构。这个文件是一种领域特定语言(DSL),用来描述数据消息的结构,包括字段名称、类型(整数、字符串、布尔值等)、字段标识号等等。...相比之下,Protobuf 序列化后的数据是二进制字节流,它并不适合人类阅读,且必须通过特定的反序列化函数才能正确解读数据。...在使用 JSON 序列化数据时,其结果往往包含人类刻度的字段名称,例如 { "id": "123456" } ,但是在 protobuf ,序列化后的结果只会包含字段编号而非字段名称,例如在本例...这三个字节分别对应了 protobuf 编码的三个内容:(在 protobuf 每个字节的首位都是控制位,用于表示随后的字节是否需要和自己属于同一个字段) Tag 标签由字段编号与字段类型组成,其编码格式为...参考资料 Protobuf 语言指南(proto3) | 掘金 如何在前端中使用protobuf(node篇) | 掘金 深入理解 ProtoBuf 原理与工程实践(概述) | 掘金 Protobuf:

    1.3K74

    protobuf、flatbuffer、msgpack 针对小数据包的简单对比

    flatbuffers 官方也是说假设你不删除字段,只会把字段设为 desperated ,而且字段ID必须从0开始,然后递增。这个是和 flatbuffers 的打包数据组织结构相关的。...毕竟在实际使用的过程,大部分字段都不会只读一次。...\000(\001 protobuf 会对整数类型使用varint来压缩空数据来减少长度。效果也比较好,打包后数据块只占用了57字节。...这个arena其实就是一个不断增长的内存块链表,可以用于保存protobuf的对象和对象数据,没有回收功能。 非常简单但也很适合 libatbus 这种动态结构少而且结构简单的协议。...protobuf 是57字节,减去数据内容的13字节后是44字节。这个差距就比较大了。在我们的实际应用场景总,往往还有一层业务层面的包头,也差不多40-50字节

    8K20

    轻松搞定 Protobuf:高效数据序列化的神器

    紧凑:Protobuf 用可变长度编码,压缩数据无压力,节省带宽和存储空间。 跨平台:Protobuf 支持多种编程语言, Java、C++、Python 等,跨平台数据交换轻松搞定。...合理设置字段编号:字段编号在 1 到 15 的范围内使用一个字节进行编码,而 16 到 2047 之间的编号需要两个字节。...为实现向前兼容,新版本不要删除或更改旧版本已有的字段编号和类型。可以添加新的字段,但要为新字段设置新的编号。 向后兼容:旧版本可以解析新版本的数据。...为实现向后兼容,新版本不要删除旧版本已有的字段。可以将不再使用的字段标记为 deprecated,但不要复用其编号。...,而旧版本没有该字段时,旧版本会使用该字段的默认值。

    56910

    Java程序员必须知道的常用序列化技术及选型,Protobuf 原理详解

    但在现实应用,就可能要求在 JVM 停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。 Java 对象序列化就能够帮助我们实现该功能。...所以,由于没有显指定 serialVersionUID,编译器又为我们生成了一个 UID,当然和前面保存在文件的那个不会一样了,于是就出现了 2 个序列化版本号不一致的错误。...Transient 关键字 Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件,在被反序列化后, transient 变量的值被设为初始值,...Java 序列化的一些简单总结 Java 序列化只是针对对象的状态进行保存,至于对象的方法,序列化不关心 当一个父类实现了序列化,那么子类会自动实现序列化,不需要显示实现序列化接口 当一个对象的实例变量引用了其他对象...采用了独特的编码方式, Varint、 Zigzag 编码方式等等 b.

    1.1K10

    客户端和服务器的通信,protobuf和协议格式

    编码负数时不够高效——如果你的字段可能含有负数,那么请使用sint32。 int64 long 使用可变长编码方式。编码负数时不够高效——如果你的字段可能含有负数,那么请使用sint64。...unit32 int[1] 总是4个字节。如果数值总是比总是比228大的话,这个类型会比uint32高效。 unit64 long[1] 总是8个字节。...bytes ByteString 可能包含任意顺序的字节数据 特殊字段 英文 中文 备注 enum 枚举(数字从零开始) 作用是为字段指定某”预定义值序列” enum Type {MAN = 0;WOMAN...builder.setUid(1); builder.addAllCostUid(costUidList); builder.setUserExp(1000) builder.build() 4、如何在游戏项目中使用...,不重要 客户端解析出根据长度读出数据长度进行解析。

    1.6K10

    Protobuf: 高效数据传输的秘密武器

    使用 Protobuf,可以先定义数据的结构和各字段的类型、字段等信息,然后使用Protobuf提供的编译器生成对应的代码,用于序列化和反序列化数据。...由于 Protobuf 是基于二进制编码的,因此可以在数据传输和存储实现更高效的数据交换,同时也可以跨语言使用。...即使在版本 2 也应该慎用,因为一旦定义,很难更改。 字段类型定义 修饰符后面紧跟的是字段类型, int32 、string。...字段后面的 =1,=2 是作为序列化后的二进制编码字段的对应标签,因为 Protobuf 消息在序列化后是不包含字段信息的,只有对应的字段序号,所以节省了空间。...具体来说,Protobuf 会将整数和浮点数等类型变换成一个或多个字节的形式,其中每个字节都包含了一部分数据信息和一部分标识符信息。

    62650

    【技术分享】深入了解tensorflow模型存储格式

    采用Estimator的export_savedmodel方法,但保存下来的模型格式总是包含在上面两种格式之内。...Block的数据区紧密排布着一个个的数据块,每个数据块先按照字节高位1或0的方式解析出3个数shared、non_shared、value_length。...数据区的数据块的key是按照字母表顺序依次排列的,索引区的每一个索引都指向某个数据块的起始位置且严格递增,因此可以借助索引进行二分查找。...3.2 计算图的存储 本节将深入计算图是如何在protobuf存储的。 首先看一下MetaGraphDef的定义,其中图就存储在graph_def。...基本的节点能组成复杂的操作,很多tensorflow在python代码的函数,tf.nn.moments,其实是由很多加法、乘法、求平均等op节点构成的,在pb并不会出现一个op是moments

    3K30

    通过一个完整例子彻底学会protobuf序列化原理

    我们的数据不管在代码是什么复杂结构体,传输时都要序列化成二进制串。官网也介绍了Protobuf的序列化算法,不过给的例子比较简单,学习起来不够直观。...一个完整的Protobuf举例 code.png 这个例子有一个特点,就是AllDataType这一结构体包含了Protobuf所支持的全部数据类型。...,我们逐个字节地来分析一下上面的打印结果,每个字节所代表的含义(可查看大图): pb编码规则.png 【1】图中橙色部分(第1行第1列,第1行第4列)用于表示字段field number(简写为fn...其中field number是proto文件中标注的该字段数字代号,而wire type表示本字段数据类型属于哪种归类,这些归类主要用于提醒反序列化程序如何判断本字段值占据几个字节。...需要注意的是字段长度数值也属于varint表示的无符号整型。 【8】对于在proto文件中用repeat修饰的字段,值部分会连续出现多次,第7行第6列到第10列。一般repeat字段都被当成数组。

    18.9K175

    protobuf在java, Android下的使用总结

    Xml、Json是目前常用的数据交换格式,它们直接使用字段名称维护序列化后类实例字段数据之间的映射关系,一般用字符串的形式保存在序列化后的字节。消息和消息的定义相对独立,可读性较好。...但序列化后的数据字节很大,序列化和反序列化的时间较长,数据传输效率不高。...Protobuf和Xml、Json序列化的方式不同,采用了二进制字节的序列化方式,用字段索引和字段类型通过算法计算得到字段之前的关系映射,从而达到更高的时间效率和空间效率,特别适合对数据大小和传输速率比较敏感的场合使用...protobuf转换过的二进制文件具有: 空间效率 Json:107个字节 Protobuf:32个字节 时间效率 Json序列化: 1ms , 反序列化:0ms Protobuf 序列化: 0ms...:protobuf-gradle-plugin:0.8.2' 2.在app的build.gradle添加两个protobuf依赖库:protobuf-java和protoc(如图:app模块添加protobuf

    1.8K10
    领券