proto如何做到节省空间。

::google::protobuf::uint32 _has_bits_[(2 + 31) / 32];


message Test

{

optional int32 aa = 1;

optional int32 bb = 2;

}

可以看出上面messgae有两个optional字段
当生成对应的代码的时候
proto帮我们同时生成了一个  ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32];

这里的2意思的两个字段,实际上就是一个bit数组,用位去标示每一个字段是否存在

依次从低位到高位,分别标示从aa到bb等等
很厉害吧
其实这也是我们工作常用的一种做法。

在message比较大的时候,optional可以很好的节省数据空间。

比较小的时候_has_bits_就占了你的空间哦



### Proto 文件的定义 Proto 文件是一种用来描述 Protocol Buffers(简称 Protobuf)数据结构的语言文件。它提供了一种简洁的方式,允许开发者明确定义消息的消息类型和字段。通过 `.proto` 文件,可以生成多种编程语言的代码,从而方便地实现跨平台的数据交换[^1]。 在一个典型的 `.proto` 文件中,主要包含以下几个组成部分: - **语法声明**:指定了使用的 Protobuf 版本(如 `proto2` 或 `proto3`),这是为了向后兼容性和功能差异而设计的。 - **包名**:防止命名冲突,类似于 Java 中的 package 声明。 - **消息体定义**:使用 `message` 关键字来定义具体的结构化数据格式[^4]。 下面是一个简单的例子展示了一个名为 `Person` 的消息类型的定义: ```proto syntax = "proto3"; // 使用 proto3 语法 package tutorial; message Person { string name = 1; int32 id = 2; // Unique ID number for this person. repeated string email = 3; } ``` --- ### Proto 文件的主要用途 #### 结构化数据的序列化与反序列化 Proto 文件的核心作用在于定义了如何将复杂的数据结构转化为一种紧凑、高效的二进制格式进行存储或网络传输,并能够在接收方重新解析为原始的对象形式。这种方式相较于传统的 XML 或 JSON 格式更加节省带宽和存储空间[^2]。 #### 跨语言支持 由于 Protobuf 支持多种主流编程语言(如 C++, Java, Python 等),因此 `.proto` 文件成为不同技术栈之间共享数据模型的理想选择。一旦定义好 `.proto` 文件,就可以利用官方提供的编译器生成对应目标语言的具体类库[^3]。 #### 可扩展性强 随着项目的演进,可能需要修改原有的数据结构。Protobuf 设计之初就充分考虑到了这一点,即使增加了新字段也不会破坏现有系统的正常工作流程。这得益于其内置的版本控制机制,即未初始化的新字段会被赋予默认值。 --- ### 总结 Proto 文件作为 Protobuf 技术体系的重要组成部分,不仅简化了开发人员对于复杂数据结构的操作难度,还极大提升了应用程序间互操作性的便利程度。凭借其高效率、强一致性和良好的可维护特性,广泛应用于现代分布式系统架构之中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值