Как проанализировать сообщение protobuf3, не зная его тип во время компиляции с Golang? - PullRequest
0 голосов
/ 29 декабря 2018

вот сценарий:

вы реализуете в golang универсальный компонент, который может использоваться с любым типом прото-сообщения (двоичная сериализация), и вам необходимо десериализовать бинарные прото-данные, не зная их тип при компиляциивремя.

Например, я столкнулся с этой проблемой при написании универсального архиватора json kafka, компонент будет:

  • получить тип сообщения (строка) из конфигурации и имяkafka topic
  • потребуется создать двоичный файл -> десериализатор памяти и сериализатор памяти -> json во время выполнения.

как вы получаете десериализатор для ваших двоичных байтов только из имени сообщения?

1 Ответ

0 голосов
/ 29 декабря 2018

библиотеки протоколов golang имеют вспомогательную утилиту для этой цели:

// MessageType returns the message type (pointer to struct) for a named message.
// The type is not guaranteed to implement proto.Message if the name refers to a
// map entry.
func MessageType(name string) reflect.Type {
   // ....
}

, чтобы использовать ее, вы можете использовать метод, подобный следующему:

func getProto(messageType string, messageBytes []byte) proto.Message {
    pbtype := proto.MessageType(messageType)
    msg := reflect.New(pbtype.Elem()).Interface().(proto.Message)
    proto.Unmarshal(messageBytes, msg)
    return msg
}

Я привел полный примерна github: https://github.com/rotemtam/pbreflect-example

...