Определить правильный класс protobuf - PullRequest
0 голосов
/ 08 апреля 2019

В моем существующем приложении ZeroMQ я играю, чтобы изменить мою полезную нагрузку на google protobuf.Во время Первоначального анализа, с которым я сталкиваюсь, у меня будет несколько протоклассов, которые также могут быть записаны в файл журнала.Теперь во время выполнения, как определить, какой прото получен.А также позже, в какой-то момент, если я прочту здесь файл журнала, я столкнусь с той же проблемой.Есть ли какое-то решение этого?И в прото2, и в прото3

1 Ответ

1 голос
/ 08 апреля 2019

Протокол буфера поддерживает множественное определение классов.Вы делаете это путем объявления всех типов классов, которые есть в вашем файле Protocol Format .

В этом примере мы объявляем два разных класса и их свойства:

syntax = "proto2";

package tutorial;

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;
}

message House {
  repeated string owner = 1;
}

Если вы хотите использовать буфер протокола в качестве стандартных протоколов связи, я думаю, вы хотите отправить один из классов.См. Официальные документы, где они объясняют, как справиться с этой ситуацией, в этой публикации .

Еще один хороший пример - создание уникального сообщения (Wrapper), которое содержит общие свойства и один из классов.:

message WrapperMessage {
    required int64 timestmap = 1;
    oneof data {
        Person person = 2;
        House house = 3;
    }   
}

Затем, прежде чем декодировать класс, вы можете проверить, какой тип класса содержит обертка, вызвав HasField.

Примечание. Протоколные буферы 3 реализуют новую функцию для этой цели на основена имущество FileDescriptorSet и Any.

...