Я стремлюсь создать API, который получает объекты JSON (вложенные и произвольного характера), упаковывает их в структуры google/protobuf/struct.proto
и отправляет их с GRPC.Все хорошо, хорошая библиотека jsonpb
охватывает процесс демаршаллинга.
Проблема возникает на сервере-получателе GRPC, он распаковывает объект struct.proto в обычную структуру данных golang для удобства использования,таким образом, он становится map[string]interface{}
с другими вложенными объектами различных видов.
Так что, когда я пытаюсь преобразовать объект обратно в struct.proto для отправки его обратно клиенту, есть несколько вариантов.Я нашел конвертер, использующий отражение, в котором есть ошибка, которую я не могу уловить (связанная с невозможностью различать типы данных, он обрабатывает вложенные объекты как интерфейс {}), этот .
После того, как я несколько часов ударил его по голове, я начинаю задаваться вопросом, является ли это даже лучшим подходом.Мне нужно преобразовать объекты struct.proto во что-то удобное и преобразовать их обратно. Есть ли лучший способ сделать преобразование максимально быстрым, сохраняя возможность вложения?
Странно, что struct.protoлегко конвертировать в одну сторону и очень трудно сделать наоборот.Должно быть, потому что единственный способ извлечь метаданные объекта - это отражение.А отсутствие обобщений делает его еще сложнее.
Использование JSON очень плохо сказывается на производительности, и gob не вариант, поскольку протокол должен быть настолько универсальным, насколько это возможно.Последний шанс, о котором я могу подумать, - это найти другого маршаллера и отправить данные в виде необработанных байтов через protobuf, а затем распаковать их на сервере.
Любая помощь приветствуется, спасибо.
РЕДАКТИРОВАТЬ 1:
Я думаю, что в конце мне придется реализовать возможность иметь несколько протоколов маршалинга и байтовый массив в определении protobuf, чтобы сервер и клиент договаривались о максимальной скорости, которую они могут поддерживать ...и это позволило бы мне реализовать это с gob и jbson в качестве запасного варианта.Комментарии?