【问题标题】:Using structs in oneOf field in Protocol Buffers v3 via Go通过 Go 在 Protocol Buffers v3 的 oneOf 字段中使用结构
【发布时间】:2017-04-02 14:43:50
【问题描述】:

因此尝试同时使用 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 没有说明不允许使用结构。我有什么遗漏吗?

【问题讨论】:

    标签: json go protocol-buffers grpc


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 2015-07-09
      • 1970-01-01
      相关资源
      最近更新 更多