协议缓冲区中的inheritance
如何处理Google Protocol Buffers 3.0中的inheritance?
Java等效代码:
public class Bar { String name; } public class Foo extends Bar { String id; }
什么是Proto等效代码?
message Bar { string name = 1; } message Foo { string id = 2; }
协议缓冲区不支持inheritance。 相反,考虑使用组合:
message Foo { Bar bar = 1; string id = 2; }
但是,也就是说,你可以使用一种技巧,比如inheritance – 但这是一个丑陋的黑客,所以你应该小心使用它。 如果您定义了以下消息类型:
message Bar { string name = 1; } message Foo { string name = 1; string id = 2; }
这两种类型是兼容的 ,因为Foo
包含Bar
字段的超集。 这意味着如果您有一种类型的编码消息,则可以将其解码为另一种类型。 如果您尝试将Bar
解码为Foo
类型,则不会设置字段id
(并将获得其默认值)。 如果将Foo
解码为类型Bar
,则将忽略字段id
。 (请注意,这些规则与在一段时间内向类型添加新字段时适用的规则相同。)
您可以使用它来实现类似inheritance的东西,通过使用几个类型,所有类型都包含“超类”字段的副本。 但是,这种方法存在一些大问题:
- 要将类型为
Foo
的消息对象转换为类型Bar
,您必须序列化并重新解析; 你不能只是施放。 这可能效率低下。 - 向超类添加新字段非常困难,因为您必须确保将字段添加到每个子类,并且必须确保这不会产生任何字段数冲突。
请参阅Protocol Buffer Basics教程:
不要去寻找类inheritance类似的工具,但协议缓冲区不会这样做。