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