【问题标题】:Time datatype mismatch between Golang cloudEvent and protoGolang cloudEvent和proto之间的时间数据类型不匹配
【发布时间】:2021-08-14 16:00:25
【问题描述】:

我正在创建一个 proto 文件(并遵循 cloudEvents 标准)。

syntax = "proto3";
option go_package = "/events";

import "google/protobuf/timestamp.proto";
import "google/protobuf/any.proto";

message Event {
    string specversion = 2;
    string type = 3;
    string source = 4;
    string id = 5;
    google.protobuf.Timestamp time = 6;
    google.protobuf.Any data = 7;
    map<string, CloudEventAttributeValue> attributes = 8;
    string datacontenttype = 9;
    string test = 10;
}

它在客户端和服务器之间运行良好。我们还想确保这个对象完全符合 cloudevents。测试一下如果我尝试使用 json.marshal() 编组这个对象,然后使用 json.unmarshal 解组到 cloudEvent 对象。在此测试中,由于 proto 对象和 cloudEvents 之间的时间字段数据类型不匹配,反序列化正在中断。

bytes, _ := json.Marshal(ev)
fmt.Println(string(bytes))

e := cloudevents.NewEvent()
json.Unmarshal(bytes, &e)

但如果我删除时间字段,一切正常。知道我错过了什么吗?

【问题讨论】:

    标签: protocol-buffers proto grpc-go cloudevents


    【解决方案1】:

    时间真的应该是编程中第三难的事情(link)。

    我对 Cloud Events 不太熟悉,但我怀疑不要求您能够使用默认编组。您似乎对管理此映射的明确方法感到满意?

    请在您的问题中包含生成的 JSON。差异是什么?您是否正在获取 RFC3339 格式的字符串表示形式并且您想要例如UNIX 时代?

    您可能需要一个自定义编组器,将原始时间戳转换为 UNIX 纪元 int,例如,用于云事件。

    【讨论】:

    • 谢谢@DazWilkin,你是对的。默认编组不是必需的。我在 golang/protobuf 上发布了这个问题,并找到了使用 protojson 的答案(它在内部更改了编组选项)。
    【解决方案2】:

    使用 protojson.Marshal 代替 json.Marshal 解决了这个问题。在内部,它通过了从原始标准编组所需的编组选项。

    https://github.com/golang/protobuf/issues/1355

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 2015-12-03
      • 2013-09-19
      相关资源
      最近更新 更多