Is it possible to detect the type of a raw protocol buffer message (in byte[])
I have a situation where an endpoint can receive different messages and I need to be able to detect the type before I can deserialize it.
I am using protobuf-net
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
You can’t detect the type in isolation, since the protobuf spec doesn’t add any data to the stream for this; however, there are a number of ways of making this easy, depending on the context:
the last approach is actually very valuable in the case of raw TCP streams; this is on the wire identical to the union type, but with a different implementation; by deciding in advance that 1=Foo, 2=Bar etc (exactly as you do for the union type approach), you can use
SerializeWithLengthPrefixto write (specifying the 1/2/etc as the field number), and the non-genericTryDeserializeWithLengthPrefixto read (this is under Serializer.NonGeneric in the v1 API, or on the TypeModel in the v2 API), you can provide a type-map that resolves the numbers back to types, and hence deserialize the correct type. And to pre-empt the question “why is this useful with TCP streams?” – because: in an ongoing TCP stream you need to use theWithLengthPrefixmethods anyway, to avoid over-reading the stream; so you might as well get the type identifier for free!summary: