具有 oneof 或聚合的常见 proto3 字段
Common proto3 fields with oneof or aggregation
我必须为一个对象制作一个原型 class,它将有大约 12 个变体。所有 12 个变体共享四个相同的字段,然后具有特定的字段。 在大多数情况下,非特定字段会比普通字段多很多。
我想知道实现此目标的最有效方法是什么。
第一个选项:在公共原型中定义公共字段class,然后在所有特定类型中声明该类型的字段:
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 个特定字段。
根据 protobuf 库,编码子消息通常会有一些性能损失。对于大多数库,例如 Google 自己的 protobuf 库,差异非常小。使用您的任何一个选项,您最终都会为每条消息编码 1 条子消息,从而进一步降低影响。
这两种格式我都见过。如果解码器端已经知道消息类型(例如从 rpc 方法名称),聚合通常更容易实现,因为它不需要单独检查 oneof 类型。
但是,如果不知道消息类型,oneof 方法会更好,因为它可以轻松检测类型。
我必须为一个对象制作一个原型 class,它将有大约 12 个变体。所有 12 个变体共享四个相同的字段,然后具有特定的字段。 在大多数情况下,非特定字段会比普通字段多很多。
我想知道实现此目标的最有效方法是什么。
第一个选项:在公共原型中定义公共字段class,然后在所有特定类型中声明该类型的字段:
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 个特定字段。
根据 protobuf 库,编码子消息通常会有一些性能损失。对于大多数库,例如 Google 自己的 protobuf 库,差异非常小。使用您的任何一个选项,您最终都会为每条消息编码 1 条子消息,从而进一步降低影响。
这两种格式我都见过。如果解码器端已经知道消息类型(例如从 rpc 方法名称),聚合通常更容易实现,因为它不需要单独检查 oneof 类型。
但是,如果不知道消息类型,oneof 方法会更好,因为它可以轻松检测类型。