繁体   English   中英

具有 oneof 或聚合的常见 proto3 字段

[英]Common proto3 fields with oneof or aggregation

我必须为一个大约有 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 个特定字段。

根据 protobuf 库,编码子消息通常会有一些性能损失。 对于大多数库,例如 Google 自己的 protobuf 库,差异非常小。 使用任一选项,您最终都会对每条消息编码 1 个子消息,从而进一步降低影响。

我见过两种常用的格式。 如果解码器端已经知道消息类型(例如 rpc 方法名称),聚合通常更容易实现,因为它不需要单独检查 oneof 类型。

但是,如果消息类型未知,oneof 方法更好,因为它可以轻松检测类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM