How can we put a variant message ( one of a few message types ) inside a protobuf message?

后端 未结 2 1827
野的像风
野的像风 2020-12-17 17:56

How can we put a variant message ( one of a few message types ) inside a protobuf message?

message typeA {
    ....
}

message typeB {
    ....
}

message ty         


        
相关标签:
2条回答
  • 2020-12-17 18:23

    You need to do it like this:

    message TypeC {
      optional TypeA a = 1;
      optional TypeB b = 2;
    }
    

    If there are a lot of variants, you might also want to add a tag field so that you don't have to check has_*() for each one.

    This is covered in the Protobuf docs: https://developers.google.com/protocol-buffers/docs/techniques#union

    PS. This missing feature of Protobufs is fixed in Cap'n Proto, a new serialization system by the same author (me): Cap'n Proto implements "unions" for this purpose. I had also implemented unions in Protobufs before leaving Google, but didn't manage to get my change merged into mainline before I left. Sorry. :(

    EDIT: It looks like the Protobuf team eventually merged my change and released version 2.6.0 with it. :) See the oneof declaration.

    0 讨论(0)
  • 2020-12-17 18:47

    Check out the new oneof feature in version 2.6: https://developers.google.com/protocol-buffers/docs/reference/java-generated#oneof

    You can now do something like this:

    message TypeC {
        oneof oneof_name {
            TypeA a = 1;
            TypeB b = 2;
        }
    }
    

    Fields in the same oneof will share memory and only one field can be set at the same time.

    0 讨论(0)
提交回复
热议问题