#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.