Несоответствие типа данных времени между Golang cloudEvent и proto

#protocol-buffers #proto #grpc-go #cloudevents

Вопрос:

Я создаю файл 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. В этом тесте десериализация нарушается из-за несоответствия типа данных поля времени между прото-объектом и облачными событиями.

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

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

Но если я удалю поле времени, все будет работать хорошо. Есть идеи, что я упускаю?

Ответ №1:

Время действительно должно быть третьей по сложности вещью в программировании (ссылка).

Я менее знаком с облачными событиями, но подозреваю, что нет никаких требований, чтобы вы могли использовать маршалинг по умолчанию. Похоже, вы были бы удовлетворены окончательным способом управления этим отображением?

Пожалуйста, включите в свой вопрос созданный JSON. В чем заключается несоответствие? Вы получаете строковые представления, скажем, формата RFC3339, и вам нужна, например, эпоха UNIX?

Вам может понадобиться пользовательский маршаллер, который преобразует временную метку прото в int эпохи UNIX, например, для облачных событий.

Комментарии:

1. Спасибо @DazWilkin, вы правы. Сортировка по умолчанию не является обязательным требованием. Я опубликовал этот вопрос на golang/protobuf и нашел ответ, который заключается в использовании protojson (который внутренне изменяет параметры сортировки).

Ответ №2:

Используя протойсон.Маршал вместо Джсона.Маршал решил этот вопрос. Внутренне он проходит маршаллинг, необходимый для маршалинга по стандартам proto.

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