通过Go在Protocol Buffers v3中的oneOf字段中使用结构

时间:2017-04-02 14:43:51

标签: json go protocol-buffers grpc

因此尝试使用Protocol Buffers v3和Go(两者都是新的)。

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;
    }
}

使用protoc转换并在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))

输出显示JSON是正确的但是protobuf编码的字节数组是空的。

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

意图是有一个这样的数组(repeated *EventWrapper)通过gRPC沿线发送,但是那些个体目​​前不起作用。 protobuf Language Guide没有说任何结构不被允许。有什么我想念的吗?

1 个答案:

答案 0 :(得分:2)

协议缓冲区文档中没有任何内容表明oneof不能构成结构,事实上example会为union字段生成结构。

我建议使用gogo,我个人曾用于之前的商业项目。具体而言,use protoc-gen-gogoslick

请参阅this section以安装必要的软件包,然后为您的项目运行以下软件

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