Полиморфизм буферного протокола

У меня есть программа на C ++, которая отправляет различные события, например, StatusEvent и DetectionEvent с различными определениями протокольных сообщений для службы сообщений (в настоящее время Active MQ, через APM activemq-cpp) , Я хочу написать прослушиватель сообщений, который получает эти сообщения, анализирует их и записывает их в cout для целей отладки. Слушатель связал status_event_pb.h и detect_event_pb.h .

Мой вопрос: Как я могу проанализировать полученное событие, не зная его типа? Я хочу сделать что-то вроде (в псевдокоде)

receive event
type = parseEventType(event);
if( type == events::StatusEventType) { 
    events::StatusEvent se = parseEvent(event);
    // do stuff with se
}
else {
    // handle the case when the event is a DetectionEvent
}

Я посмотрел на этот вопрос , но я не уверен, являются ли расширения подходящими для этого. Короткий фрагмент кода, указывающий путь, будет высоко ценится. Примеры на protobuf так редки!

Спасибо!


Кажется, расширения - это действительно путь, но у меня есть еще один момент, который нужно прояснить. Вот предварительное определение, которое у меня есть до сих пор:

// A general event, can be thought as base Event class for other event types.
message Event {
    required int64 task_id = 1;     
    required string module_name = 2;    // module that sent the event

    extensions 100 to 199;               // for different event types
}

// Extend the base Event with additional types of events.
extend Event {
    optional StatusEvent statusEvent = 100;
    optional DetectionEvent detectionEvent = 101;
}

// Contains one bounding box detected in a video frame, 
// representing a region of interest.
message DetectionEvent {
    optional int64 frame = 2;   
    optional int64 time = 4;
    optional string label = 6;
}

// Indicate status change of current module to other modules in same service.
// In addition, parameter information that is to be used to other modules can
// be passed, e.g. the video frame dimensions.
message StatusEvent {
    enum EventType { 
        MODULE_START = 1; 
        MODULE_END = 2; 
        MODULE_FATAL = 3; 
    }
    required EventType type = 1;        
    required string module_name = 2;    // module that sent the event

    // Optional key-value pairs for data to be passed on.
    message Data {
        required string key = 1;
        required string value = 2;
    }
    repeated Data data = 3; 
}

Моя проблема сейчас состоит в том, чтобы (1) узнать, какое конкретное событие содержится в сообщении о событии, и (2) убедиться, что оно содержит только одно такое событие (согласно определению, он может содержать и StatusEvent , и DetectionEvent ).

5
задан Community 23 May 2017 в 12:29
поделиться