Search code examples
c#protocol-buffersprotobuf-csharp-port

Is it possible to detect message type in protobuf-csharp-port?


A java client constructs a Message according to this skeleton :

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
 ...

This message is sent to a C# program ( server side).

The server knows how to read the bytes ( first byte is the number of bytes to read which represents the size of the following message ).

This is how MSG is being constructed by a byte array.

 MSG Msg = MSG.CreateBuilder().MergeFrom(buffer).Build();

Where buffer is the byte array which read from the socket.

But now I'm in a situation where a client needs to send "Heartbeat" message( another message) in order to check if the server is alive or not. ( the server should respond : "yes i'm alive")

Sure , I can add another field to the MSG class. but I don't want to because the MSG class has a lot of unnecessary fields - for a Heartbeat operation.

Question :

The server read n bytes. Is there anyway I can know if this is a MSG message or a "Heartbeat" message ?


Solution

  • Is there anyway I can know if this is a MSG message or a "Heartbeat" message?

    No. Protocol buffer messages don't contain any such type information. Typically the way round this is to have a "wrapper" type with a field for each message you might want to send. You'd ideally want to express this as a oneof, but my port doesn't support that (yet).

    The overhead is minimal - but it will be a protocol change, of course, so you'll need to think about any existing servers etc.