Using structures in oneOf field in v3 protocol buffers via Go

So trying to use v3 protocol buffers and go together (new to both).

example.proto

syntax = "proto3";

package test;

import "google/protobuf/timestamp.proto";

message Metadata {
    uint64 userID = 2;
    google.protobuf.Timestamp time= 3; 
}

//SignOff when user logs out of Glory
message SignOff {
    Metadata metadata =1;
}

//SignOn when user logs into Glory
message SignOn {
    Metadata metadata =1;
}

message EventWrapper {
    oneof event {
        SignOff signOff = 1;
        SignOn signOn = 2;
    }
}

      

Converting with protoc

and using in Go

now, _ := ptypes.TimestampProto(time.Now())
event := &pb_test.EventWrapper{
    Event: &pb_test.EventWrapper_SignOn{
        SignOn: &pb_test.SignOn{
            Metadata: &pb_test.Metadata{
                UserID: 1234,
                Time:   now,
            },
        },
    },
}
protoBytes, err := proto.Marshal(event)
if err != nil {
    log.Fatal(err)
}
log.Println(len(protoBytes) == 0)

jsonBytes, _ = json.MarshalIndent(event, "", "\t")
log.Println(string(jsonBytes))

      

The output shows the JSON is correct, but the protobuf byte array is empty.

{
    "Event": {
        "SignOn": {
            "metadata": {
                "userID": 1234,
                "time": {
                    "seconds": 1491143507,
                    "nanos": 654053400
                }
            }
        }
    }
}

      

The goal is to have an array of them ( repeated *EventWrapper

) to send over the cable via gRPC, but the individual ones are not working at the moment. The Protobuf Language Guide says nothing about structures not being allowed. Is there something I am missing?

+3


source to share


1 answer


Nothing in the Buffer protocol documentation indicates that oneof

structs cannot be, and in fact the example generates structures for the field union

.

I recommend using gogo , which I have personally used for previous commercial projects. In particular,use protoc-gen-gogoslick



See this section to install the required packages and then run the following for your project

protoc --gogoslick_out=Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types:. example.proto

      

+2


source







All Articles