Можно ли определить тип сообщения в protobuf-csharp-port?
Java-клиент создает сообщение в соответствии с этим скелетом:
package tutorial;
option java_package = "com.example.sff.piki2";
option java_outer_classname = "MsgProtos";
message MSG {
required string guid = 1;
required int32 MsgCode = 2;
required int32 From = 3; //sender
...
Это сообщение отправляется программе C# (на стороне сервера).
Сервер знает, как читать байты (первый байт - это количество байтов для чтения, которое представляет размер следующего сообщения).
Вот как MSG создается байтовым массивом.
MSG Msg = MSG.CreateBuilder().MergeFrom(buffer).Build();
Где buffer - это байтовый массив, который читается из сокета.
Но теперь я нахожусь в ситуации, когда клиент должен отправить сообщение "Heartbeat" (другое сообщение), чтобы проверить, работает ли сервер или нет. (сервер должен ответить: "да, я жив")
Конечно, я могу добавить еще одно поле в MSG
учебный класс. но я не хочу, потому что MSG
В классе много ненужных полей - для операции Heartbeat.
Вопрос:
Сервер прочитал n байтов. Есть ли в любом случае, я могу знать, если это MSG
сообщение или сообщение "Сердцебиение"?
1 ответ
Могу ли я узнать, является ли это сообщение MSG или сообщение "Heartbeat"?
Нет. Сообщения буфера протокола не содержат никакой информации такого типа. Обычно обходной путь заключается в том, чтобы иметь тип "обертка" с полем для каждого сообщения, которое вы, возможно, захотите отправить. Вы бы идеально хотели выразить это как oneof
, но мой порт не поддерживает это (пока).
Затраты минимальны - но это, конечно, будет изменение протокола, поэтому вам нужно подумать о любых существующих серверах и т. Д.