Я пытаюсь использовать буферы протокола Google (protobuf )с Python в сетевой программе, используя голые сокеты. Мой вопрос: :после того, как передающая сторона отправляет сообщение, как принимающая сторона узнает, какое сообщение было передано? Например, скажем, у меня есть определения сообщений:
message StrMessage {
required string str = 1;
}
message IntMessage {
required int32 num = 1;
}
Теперь передатчик создает StrMessage
, сериализует его и отправляет сериализованные байты по сети. Как получатель узнает, что нужно десериализовать байты с помощью StrMessage, а не IntMessage? Я пытался сделать две вещи:
// Proposal 1: send one byte header to indicate type
enum MessageType {
STR_MESSAGE = 1;
INT_MESSAGE = 2;
}
// Proposal 2: use a wrapper message
message Packet {
optional StrMessage m_str = 1;
optional IntMessage m_int = 2;
}
Однако ни один из них не кажется очень чистым, и оба требуют, чтобы я вручную перечислил все типы сообщений. Есть ли канонический/лучший способ справиться с этой проблемой?
Спасибо!