Можно ли определить тип сообщения в 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, но мой порт не поддерживает это (пока).

Затраты минимальны - но это, конечно, будет изменение протокола, поэтому вам нужно подумать о любых существующих серверах и т. Д.

Другие вопросы по тегам