2016-09-22 40 views
2

如果我定义:如何未在protocbuf分配的值可选字段被分配空间

message A { 
required int32 first = 1; 
optional int32 second = 2; 
} 

的空间的尺寸时set_second(0),则serializeToArray()是不相同的条件是当set_second(14353355445 )然后serializeToArray()

有没有办法让它们具有相同的空间大小?

在其他方面,我怎样才能使未分配值的可选字段具有相同大小的空间,就像它们被赋值一样?

+0

不要使用protobuf?这是protobuf的目的。找一些其他的序列化库。 –

+0

@DarkFalcon使用protobuf作为序列化库没有任何问题。 –

+1

@πάνταῥεῖ:我没有说有。我说如果他希望总是包含问题*中提到的所有字段*,那么股票protobuf库可能不会发生这种情况。 –

回答

0

这是encoded in a special way节省带宽,因此不同的整体大小。如果您希望/需要它始终具有相同的大小,您可以选择使用fixed32字段类型。


但是,您应该注意,如果您根本没有为可选字段设置值,则序列化大小会再次有所不同。

+0

请注意,这仍然不会强制消息中出现可选字段。 –

+0

@DarkFalcon实质上是这样,但OP提到'set_second(0)'。大小的差异来自编码机制。 –

+0

OP还说“未分配值的可选字段”。无论如何,从proto3开始,甚至明确地将其设置为默认值,似乎不再发送它:“行为在proto2和proto3之间改变。在proto3下,不再有单独的”存在“概念。只有当它不等于其默认值时,字段才会在电线上发送。“ http://stackoverflow.com/questions/9168052/how-do-has-field-methods-relate-to-default-values-in-protobuf –

1

我的建议是:不要试图用Protobuf做到这一点。 Protobuf的设计不是为了给你固定的或者可预测的尺寸,所以如果这就是你想要的,那么Protobuf就不适合这项工作。

当然,您可以像使用fixed32一样使用黑客技巧,并尝试确保您的字段始终具有非默认值,但是您正在与您的工具作斗争。未来可能会发生其他变化,使尺寸再次变得不可预测。最好选择一款符合您需求的工具。

+0

嘿肯顿protobuf的创造者。深深的敬意。 OP给我发了[最近的评论](http://stackoverflow.com/questions/39644416/how-can-optional-fields-that-are-not-assigned-values-in-protocbuf-be-allocated-s/39644611?noredirect = 1#comment66607593_39644611)确认了它的XY问题。IMO protobuf似乎对他们来说是完美的。他们需要尽可能小的空间,而不是固定的大小。 –

+0

你让我的专业生产代码像魅力一样运行!再次深深地拜拜。 –

+0

(我实际上怀疑OP根本不需要固定宽度,但很难说没有更多细节。) –