Общие поля proto3 с одним или агрегацией - PullRequest
1 голос
/ 15 марта 2019

Я должен создать протокласс для объекта, который будет иметь около 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 Ответ

1 голос
/ 16 марта 2019

В зависимости от библиотеки protobuf обычно существует некоторое снижение производительности для кодирования подсообщений. Для большинства библиотек, таких как собственные библиотеки Google Protobuf, разница очень мала. Используя любой из этих вариантов, вы в конечном итоге закодируете 1 суб-сообщение на сообщение, что еще больше снижает воздействие.

Я видел оба широко используемых формата. Если сторона декодера уже знает тип сообщения (например, из имени метода rpc), агрегацию обычно проще реализовать, поскольку она не требует отдельной проверки типа oneof.

Однако, если тип сообщения неизвестен, лучше использовать один из методов, поскольку он позволяет легко определить тип.

...