Protobuf разархивирует произвольные сообщения. Полиморфизм сообщений Protobuf

#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 могут представлять это как полиморфизм, хотя это не работает по умолчанию.