Protocol buffers 如何使用protobuf对嵌套消息进行编码/解码?

Protocol buffers 如何使用protobuf对嵌套消息进行编码/解码?,protocol-buffers,Protocol Buffers,我有一个protobuf结构,它表示结构的嵌套层/封套。对这些数据进行编码时,整个层次结构可以在一个集合中处理 然而,在解码时,仅应对第一个外层信封进行解码,嵌套信封需要保持编码,以便通过下游,以便由下一个架构层进行解码,等等。每一层只知道用于它的信封的结构 现在每个信封都有一个单独的proto文件,嵌套信封在它们的父级中表示为字节。我不喜欢这种方法,因为它需要维护单独的文件和非平凡的编码代码 有没有更好的方法来处理这个问题?还有一个额外的问题,当使用nanopb时,有没有更好的方法?如果您使用

我有一个protobuf结构,它表示结构的嵌套层/封套。对这些数据进行编码时,整个层次结构可以在一个集合中处理

然而,在解码时,仅应对第一个外层信封进行解码,嵌套信封需要保持编码,以便通过下游,以便由下一个架构层进行解码,等等。每一层只知道用于它的信封的结构

现在每个信封都有一个单独的proto文件,嵌套信封在它们的父级中表示为字节。我不喜欢这种方法,因为它需要维护单独的文件和非平凡的编码代码

有没有更好的方法来处理这个问题?还有一个额外的问题,当使用nanopb时,有没有更好的方法?

如果您使用的是proto2(而不是proto3),这似乎非常适合。每个“外部”消息将定义一个扩展范围,例如(引用文档):

然后,在“内部”模式中,您可以为父消息声明其他字段-普通字段或整个对象:

message Bar { /*...*/ }
extend Foo {
  optional Bar bar = 126;
}
然后,“内部”代码使用“扩展”API用于所选框架的任何内容;如果您使用的是Google实现,这是一系列方法,如
HasExtension()
ClearExtension()
GetExtension()
MutableExtension()
,和
AddExtension()
,但不同的实现可能有不同的API

使用这种方法,“外部”消息从来没有(或需要)任何关于内部数据的知识;图书馆处理所有这些问题

这种方法的优点在于,使用
字节与字节是相同的,因此,如果您使用了以下数据,那么您现有的数据应该完全兼容:

message Foo {
    optional bytes bar = 126;
}

请注意,proto3不实现扩展。有一个新的概念,提供了大致相似的结果,但工作方式非常不同。它在字节方面不兼容。

如果您使用的是proto2(而不是proto3),这似乎非常适合。每个“外部”消息将定义一个扩展范围,例如(引用文档):

然后,在“内部”模式中,您可以为父消息声明其他字段-普通字段或整个对象:

message Bar { /*...*/ }
extend Foo {
  optional Bar bar = 126;
}
然后,“内部”代码使用“扩展”API用于所选框架的任何内容;如果您使用的是Google实现,这是一系列方法,如
HasExtension()
ClearExtension()
GetExtension()
MutableExtension()
,和
AddExtension()
,但不同的实现可能有不同的API

使用这种方法,“外部”消息从来没有(或需要)任何关于内部数据的知识;图书馆处理所有这些问题

这种方法的优点在于,使用
字节与字节是相同的,因此,如果您使用了以下数据,那么您现有的数据应该完全兼容:

message Foo {
    optional bytes bar = 126;
}


请注意,proto3不实现扩展。有一个新的概念,提供了大致相似的结果,但工作方式非常不同。它与字节不兼容。

谢谢,马克。看起来NanoPB实现支持扩展,所以我可能很幸运。谢谢,Marc。看起来NanoPB实现支持扩展,所以我可能很幸运。