我必须为一个将产生约12种变化的对象生成原型类。所有12个变体都共享四个相同的字段,然后具有特定的字段。 在大多数情况下,非特定字段会比普通字段多得多。。
我想知道实现这一目标的最有效方法。
第一个选择:在通用原型类中定义通用字段,然后在所有特定类型中声明此类型的字段:
message CommonFields {
// common_field1
// ... common_fieldN
}
message SpecificType1 {
CommonFields common = 1;
// specific fields...
}
或者最好先定义一个包含字段的顶级协议,然后再定义一个oneof字段,该字段可以引用包含特定字段的另一种类型:
message BaseType {
// common_field_1
// ... common_field_N
oneof specific_fields {
SpecificTypeFields1 type1_fields = N;
SpecificTypeFields2 type1_fields = N+1;
}
}
message SpecificTypeFields1 {
// specific fields...
}
message SpecificTypeFields2 {
// specific fields...
}
我对性能和约定特别感兴趣。或者,如果还有其他更典型的方法,例如重复通用字段。。请记住,尽管我的原型只有4个通用字段,通常是3-8个特定字段。
答案 0 :(得分:1)
根据protobuf库,编码子消息通常会降低性能。对于大多数库,例如Google自己的protobuf库,两者之间的差别很小。无论使用哪种选项,最终每条消息都会编码1个子消息,从而进一步减少了影响。
我看过两种常用的格式。如果解码器端已经知道了消息类型(例如,从rpc方法名称中得知),则聚合通常更容易实现,因为它不需要单独检查一个类型。
但是,如果消息类型未知,则其中一种方法更好,因为它可以轻松检测该类型。