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

因此,尝试使用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
                }
            }
        }
    }
}

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

最佳答案 Protocol Buffer文档中没有任何内容表明oneof不能结构化,实际上 example会为union字段生成结构.

我建议使用gogo,我个人用于以前的商业项目.具体来说,使用protoc-gen-gogoslick

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

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