#c# #.net #go #udp #protocol-buffers
#c# #.net #Вперед #udp #протокол-буферы
Вопрос:
Существует сервер Go, который принимает сообщения через UDP. Используя этот дизайн, он сможет сканировать только один конкретный тип объекта, world.Entity
.
for {
buf := make([]byte, 1024)
n, addr, err := pc.ReadFrom(buf)
if err != nil {
log.Println(err)
continue
}
packet := amp;service.Packet{}
err = proto.Unmarshal(buf[:n], packet)
if err != nil {
log.Println(err)
continue
}
log.Println(packet)
go serve(pc, addr, buf[:n])
}
Как можно изменить дизайн таким образом, чтобы можно было отправлять сообщения разных типов? Причина в том, чтобы заставить этот UDP-сервер работать как REST API. Допустим, есть world.Packet
сообщение, состоящее из поля перечисления и другого поля, которое может содержать сообщения разных типов. Сервер проверяет перечисление и в зависимости от него пытается разархивировать сообщение, которое может быть нескольких типов. Есть ли в Protobuf инструменты, которые сделали бы это возможным?
Я понимаю, что это не единственное решение. Более простой подход (но более подробный) заключается в создании разных типов сообщений для разных «конечных точек» (сообщений с разными полями перечисления). Существуют ли другие решения? Какой из них, по вашему мнению, лучший?
Комментарии:
1. @MarcGravell это идеально. Не могли бы вы опубликовать это в качестве ответа?
Ответ №1:
В protobuf посмотрите oneof
. С помощью одного / общего внешнего сообщения с oneof
полем вы можете автоматически обрабатывать все ожидаемые внутренние типы. Некоторые реализации protobuf могут представлять это как полиморфизм, хотя это не работает по умолчанию.