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

Using structs in oneOf field in Protocol Buffers v3 via Go

所以尝试同时使用 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 没有说明任何关于不允许的结构。有什么我想念的吗?

Protocol Buffer 文档中没有任何内容表明 oneof 不能是结构,事实上 exampleunion 字段生成结构。

我推荐使用gogo,我个人在之前的商业项目中使用过。具体来说,use protoc-gen-gogoslick

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

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