带有或之一的通用proto3字段

时间:2019-03-15 16:00:19

标签: protocol-buffers grpc proto proto3

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

1 个答案:

答案 0 :(得分:1)

根据protobuf库,编码子消息通常会降低性能。对于大多数库,例如Google自己的protobuf库,两者之间的差别很小。无论使用哪种选项,最终每条消息都会编码1个子消息,从而进一步减少了影响。

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

但是,如果消息类型未知,则其中一种方法更好,因为它可以轻松检测该类型。