当前位置 : 主页 > 大数据 > 区块链 >

protocol-buffers – 在protobuf 2中编码“可空”字段的首选方法是什么?

来源:互联网 收集:自由互联 发布时间:2021-06-22
我正在定义一个ProtoBuf消息,其中我想要一个“可空”字段 – 即,我想要区分具有值而没有值的字段.举一个具体的例子,假设我有“x”和“y”字段来记录某个对象的坐标.但在某些情况下
我正在定义一个ProtoBuf消息,其中我想要一个“可空”字段 – 即,我想要区分具有值而没有值的字段.举一个具体的例子,假设我有“x”和“y”字段来记录某个对象的坐标.但在某些情况下,坐标是未知的.以下定义不起作用,因为如果未指定x或y,则它们默认为零(这是一个有效值):

message MyObject {
    optional float x = 1;
    optional float y = 2;
}

一种选择是添加一个布尔字段,记录相应字段的值是否已知.即:

message MyObject {
    optional bool has_x = 1; // if false, then x is unknown.
    optional bool has_y = 2; // if false, then y is unknown.
    optional float x = 3; // should only be set if has_x==true.
    optional float y = 4; // should only be set if has_y==true.
}

但是这会增加一些额外的簿记 – 例如,当我设置x字段的值时,我必须始终记住也设置has_x.另一种选择是使用列表值,其中列表总是长度为0或长度为1:

message MyObject {
    repeated float x = 1; // should be empty or have exactly 1 element.
    repeated float y = 2; // should be empty or have exactly 1 element.
}

但在这种情况下,定义似乎有点误导,界面并没有好多少.

有没有第三种选择我没有想到比这两种更好?你是如何处理在protobuf中存储可空字段的?

Protobuf 2消息具有“可空字段”的内置概念. C接口包含方法has_xxx和clear_xxx,以检查字段是否已设置并分别取消设置字段.

由于使用“标签”在消息中编码字段的方式,此功能“免费”.未设置字段在编码消息中简单地“不存在”.

Proto 3 does not have this feature,而是将任何缺少的字段设置为its default value.

网友评论