Задать вопрос

Google Protobuf — как определить тип пришедшего сообщения?

Изучаю protobuf, столкнулся с такой бедой. Допустим, есть такой .proto:
syntax = "proto3";
package example;
message Kaboom {
    uint64 data = 1;
}
message Oops {
    uint64 data = 1;
}

Сообщения пересылаются по WebSocket между сервером на Golang и клиентом на JavaScript.
Сервер ожидает новых команд от клиента, и клиент может отправить как Kaboom так и Oops. Сервер не может знать наперед, какой тип сообщения придет, и тут возникает вопрос, а как же десериализировать данные, которые пришли через WebSocket не зная типа заранее?
Встречал где-то статью от 2011 года, где на похожий вопрос советовали создать message-обертку, в которую включить существующие типы, а на стороне сервера проверять, какое поле заполнено. Почему-то мне кажется, что это решение далеко от оптимального.
Надеюсь на полезные советы, спасибо что дочитали.
  • Вопрос задан
  • 1675 просмотров
Подписаться 1 Оценить Комментировать
Ответ пользователя Фади Хадж К ответам на вопрос (2)
fdhadzh
@fdhadzh
Perfectionist with deadlines
Можно сделать поле `kind`.

syntax = "proto3";

package entity;

message Entity {
  // Kinds:
  //
  // * kaboom
  // * oops
  string kind = 1;

  message Kaboom { uint64 data = 1; }

  message Oops { uint64 data = 1; }

  Kaboom kaboom = 2;

  Oops oops = 3;
}


package main

import (	
	"github.com/golang/protobuf/proto"
	
	"pathtopkg/entity"
)

func main() {
	var e entity.Entity

	err := proto.Unmarshal(buf, &e)
	if err != nil {
		panic(err)
	}

	switch e.Kind {
	case "kaboom":
		// Kaboom
	case "oops":
		// Oops
	default:
		panic("Invalid kind")
	}
}
Ответ написан
Комментировать