【发布时间】:2012-02-07 21:26:10
【问题描述】:
我正在定义一个 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 中存储可为空的字段的?
【问题讨论】:
-
有a Proto 3 version of this question,如果其他人发现这个但使用的是 Proto 3。
标签: protocol-buffers