Hi Feng,

Thank you for the answer. Good point about redundant type information in 
the header message.

Regards,

/David

On Monday, May 16, 2016 at 11:01:47 PM UTC+2, Feng Xiao wrote:
>
>
>
> On Mon, May 16, 2016 at 11:30 AM, 'David Koch' via Protocol Buffers <
> [email protected] <javascript:>> wrote:
>
>> Our platform generates/processes different types of proto3 messages with 
>> Kafka as buffer. We currently store this type as part of the Kafka message 
>> key so message consumers know which class to use for de-serialization.
>>
>> I want to add the type to the serialized message in order to not rely on 
>> the existence of a separate key. I thought about creating a wrapper message 
>> like this:
>>
>> message Header {
>>   enum PayloadType {
>>     TYPE_ONE = 1;
>>     TYPE_TWO = 2;
>>   }
>>
>>   int64 tmst = 1;
>>   string message_id = 2;
>>   string producer_id = 3;
>>   PayloadType payload_type = 4;
>> }
>>
>>
>> // Any payload.
>> message MessageWrapper {
>>   Header header = 1;
>>   Any payload = 2;
>> }
>>
>>
>> or alternatively:
>>
>> // List different payload options.
>> message MessageWrapper {
>>   Header header = 1;
>>   oneof payload {
>>     PayloadTypeOne payload_type_one = 2;
>>     PayloadTypeTwo payload_type_two = 3;
>>   }
>> }
>>
>>
>> My question: Is one of the two alternatives to be preferred?
>>
> I don't think you need the header in either case. If you are using an Any 
> message as payload, the payload already has the message type encoded in the 
> type URL. If you are using an oneof, the receiver can also query which 
> payload is set by using the oneof case API.
>
> Comparing the two (using Any and using oneof), using Any would give your 
> users more flexibility to use their own message types, while using oneof 
> will require all users to define their message types in a single place (all 
> imported by the MessageWrapper type). The API for oneof is straightforward 
> then Any though. If you need the flexibility to allow different components 
> to define different payload types, Any is probably better. Otherwise I 
> would favor the simpler oenof API.
>  
>
>>
>> Using Any leads to more complex setting/getting in the application code 
>> but it is more generic from the message definition point of view. Dropping 
>> the Header.PayloadType field in the definition using Any would allow me 
>> to not modify the MessageWrapper definition at all when adding new 
>> payload types.
>>
>> Thanks.
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Protocol Buffers" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected] 
>> <javascript:>.
>> Visit this group at https://groups.google.com/group/protobuf.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.

Reply via email to