J'ai un programme C++ qui envoie divers événements, par ex. StatusEvent
et DetectionEvent
avec différentes définitions de message proto à un service de messagerie (actuellement MQ active, via l'APU activemq-cpp). Je veux écrire un écouteur de message qui reçoit ces messages, les analyse et les écrit à cout, à des fins de débogage. L'écouteur a status_event_pb.h
et detection_event_pb.h
lié.Polymorphisme de tampon de protocole
Ma question est: Comment puis-je analyser l'événement reçu sans connaître son type? Je veux faire quelque chose comme (dans le code pseudo)
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
}
Je regardais this question mais je ne suis pas sûr si les extensions sont la bonne façon d'aller ici. Un extrait de code court pointant le chemin sera très apprécié. Les exemples sur protobuf sont si rares!
Merci! Il semble que les extensions sont effectivement la voie à suivre, mais j'ai un dernier point à éclaircir. Voici la définition proto que j'ai jusqu'à présent:
// 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;
}
Mon problème est maintenant (1) comment savoir quel événement spécifique que le message de l'événement contient et (2) assurez-vous qu'il ne contient que un tel événement (selon la définition, il peut contenir à la fois un StatusEvent
et un DetectionEvent
).
trouvé ce fil intéressant: http://markmail.org/ message/dgmf5iuhhgoe7keb # requête: protocole% 20buffer% 20polymorphisme + page: 1 + milieu: 73p5kddhvmokcpvo + état: résultats – recipriversexclusion
Possible copie de [quelle est la bonne façon de faire du polymorphisme avec des tampons de protocole?] (http://stackoverflow.com/q/3018743/1468366) – MvG