Viv*_*nha 25 java protocol-buffers protocol-buffers-3
如何处理Google Protocol Buffers 3.0中的继承?
Java等效代码:
public class Bar {
String name;
}
public class Foo extends Bar {
String id;
}
Run Code Online (Sandbox Code Playgroud)
什么是Proto等效代码?
message Bar {
string name = 1;
}
message Foo {
string id = 2;
}
Run Code Online (Sandbox Code Playgroud)
Ken*_*rda 31
协议缓冲区不支持继承.相反,考虑使用组合:
message Foo {
Bar bar = 1;
string id = 2;
}
Run Code Online (Sandbox Code Playgroud)
但是,这就是说,你可以使用一种技巧,就像继承一样 - 但这是一个丑陋的黑客,所以你应该小心使用它.如果您定义了以下消息类型:
message Bar {
string name = 1;
}
message Foo {
string name = 1;
string id = 2;
}
Run Code Online (Sandbox Code Playgroud)
这两种类型是兼容的,因为Foo包含了字段的超集Bar.这意味着如果您有一种类型的编码消息,则可以将其解码为另一种类型.如果您尝试解码Baras类型Foo,id则不会设置该字段(并将获得其默认值).如果解码Foo为类型Bar,则该字段id将被忽略.(请注意,这些规则与在一段时间内向类型添加新字段时适用的规则相同.)
您可以使用它来实现类似继承的东西,通过使用几个类型,所有类型都包含"超类"字段的副本.但是,这种方法存在一些大问题:
Foo为类型Bar,您必须序列化并重新解析; 你不能只是演员.这可能是低效的.And*_*ner 16
请参阅Protocol Buffer Basics教程:
不要去寻找类继承类似的工具,但协议缓冲区不会这样做.
| 归档时间: |
|
| 查看次数: |
20929 次 |
| 最近记录: |