我有一个protobuf结构,它表示结构的嵌套层/信封。对这些数据进行编码时,可以在一组中处理整个层次结构。
但是,当解码时,仅应解码第一个外部信封,并且嵌套的信封需要保持编码以按原样传递给下游,以便由下一个体系结构层进行解码,等等。每层仅了解信封的结构为此。
现在,我为每个信封都有一个单独的原始文件,嵌套的信封在其父级中以字节表示。我不喜欢这种方法,因为它需要维护单独的文件和用于编码的简单代码。
是否有更好的方法来处理此问题?还有一个问题是,使用nanopb时有更好的方法吗?
答案 0 :(得分:4)
如果您使用的是proto2(而不是proto3),那么这似乎很适合extensions。每个“外部”消息都会定义一个扩展范围,例如(引自doc):
message Foo {
// ...
extensions 100 to 199;
}
然后,在“内部”架构中,您可以为父消息声明其他字段-琐碎字段或整个对象:
message Bar { /*...*/ }
extend Foo {
optional Bar bar = 126;
}
然后,“内部”代码对您选择的框架使用任何“扩展” API;如果您使用的是Google实现,则该方法的范围很广,例如HasExtension()
,ClearExtension()
,GetExtension()
,MutableExtension()
和AddExtension()
-但实现方式不同可能有不同的API。
通过这种方法,“外部”消息永远不会(或不需要)对内部数据的任何了解;图书馆负责处理所有问题。
此方法的优点是使用bytes
是按字节的 id -因此,您现有的数据应该与使用过的数据完全兼容:
message Foo {
optional bytes bar = 126;
}
请注意,proto3 不实现扩展。有一个新的Any
概念可以提供广泛的相似的结果,但效果却大不相同。它不是按字节兼容的。