通过 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
不能是结构,事实上 example 为 union
字段生成结构。
我推荐使用gogo,我个人在之前的商业项目中使用过。具体来说,use protoc-gen-gogoslick
请参阅 this section 安装必要的软件包,然后 运行 为您的项目安装以下内容
protoc --gogoslick_out=Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types:. example.proto
所以尝试同时使用 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
不能是结构,事实上 example 为 union
字段生成结构。
我推荐使用gogo,我个人在之前的商业项目中使用过。具体来说,use protoc-gen-gogoslick
请参阅 this section 安装必要的软件包,然后 运行 为您的项目安装以下内容
protoc --gogoslick_out=Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types:. example.proto