gpt4 book ai didi

protocol-buffers - Protocol Buffer - 唯一编号标签 - 澄清?

转载 作者:行者123 更新时间:2023-12-03 10:15:03 26 4
gpt4 key购买 nike

我正在使用 Protocol Buffer ,一切正常。除了我不明白的事实 - 为什么我需要 proto 中的编号标签文件 :

message SearchRequest {
required string query = 1;
optional int32 page_number = 2;
optional int32 result_per_page = 3;
}

当然我已经阅读了 docs :

As you can see, each field in the message definition has a unique numbered tag. These tags are used to identify your fields in the message binary format, and should not be changed once your message type is in use.



我不明白如果我改变它会有什么不同。 (我将创建一个新的 proto 并编译它 - 那么它为什么要关心?)

Another article states that :

Numbered fields in proto definitions obviate the need for version checks which is one of the explicitly stated motivations for the design and implementation of Protocol Buffers. As the developer documentation states, the protocol was designed in part to avoid “ugly code” like this for checking protocol versions:


if (version == 3) {
...
} else if (version > 4) {
if (version == 5) {
...
}
...
}

问题

是我一个人还是完全不清楚?

让我换个方式问一下:

如果我有一个像上述文件一样的 proto 文件,然后我将其更改为:
message SearchRequest {
required string query = 3; //reversed order
optional int32 page_number = 2;
optional int32 result_per_page = 1;
}

它在乎什么?我重新编译并添加了文件(上周我已经做了多次)。

我错过了什么?您能否为这个编号的标签提供人与人之间的解释?

最佳答案

编号标签用于在序列化和反序列化数据时匹配字段。

显然,如果您更改编号方案,并将此更改应用于序列化程序和反序列化程序,则没有问题。

不过考虑一下,如果您使用第一个编号方案保存数据,并使用第二个编号方案加载它,它会尝试加载 query进入 result_per_page ,反序列化可能会失败。

现在,为什么这很有用?
假设您需要向数据添加另一个字段,在架构已经使用很久之后:

message SearchRequest {
required string query = 1;
optional int32 page_number = 2;
optional int32 result_per_page = 3;
optional int32 new_data = 4;
}

因为你明确地给它一个数字,你的反序列化器仍然能够加载使用旧编号方案序列化的数据,忽略不存在的数据的反序列化。

关于protocol-buffers - Protocol Buffer - 唯一编号标签 - 澄清?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26826421/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com