Golang Protobuf Маршал Пустая структура с фиксированным размером - PullRequest
0 голосов
/ 23 октября 2018

У меня есть структура protobuf Data

в .proto:

message Data {
    uint64 ID = 1;
    uint32 GUID = 2;
}

в Голанге

b, err := proto.Marshal(&pb.Data{})
if err != nil {
    panic(err)
}
fmt.Println(len(b))

Я получил 0 длина!

Как сделать proto.Marshal всегда возвращать фиксированный размер независимо от того, что такое pb.Data?

ps.

pb.Data содержит только int64 и int32

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Здесь есть две проблемы

1) protobuf использует кодировку varint для целых чисел, поэтому размер зависит от значения, см. эту ссылку

2) нулевое значениеполя не передаются по умолчанию, поэтому, поскольку два целых числа равны нулю, даже их идентификаторы полей не отправляются.Я на самом деле не уверен, что есть даже возможность отправить нулевые значения, глядя на документы

, если вы установите их оба на 1, у вас будет больше нуля байтов, но он все равно выиграетне может быть фиксированной длины, в зависимости от диапазона значений

, поэтому нет реального способа обеспечить фиксированный размер в сообщениях protobuf в целом

, если вы хотите сообщения фиксированной длины, вы, вероятно,Лучше использовать прямое кодирование типа Structs-on-the-Wire, но тогда для языкового взаимодействия сложнее, так как им всем придется определять одно и то же сообщение, и вы потеряете простую миграцию сообщений и все классные вещи, которые дает protobuf.

Cap'n Proto может иметь опцию для структур фиксированного размера, но они также обычно сжимаются, что, опять же, приводит к сообщениям переменной длины.

Если вы опишитепроблему, которую вы пытаетесь решить, мы можем предложить другие варианты.

0 голосов
/ 23 октября 2018

Вы вызываете len() в байтовом массиве.Он собирается посчитать количество элементов в этом массиве и вернуть его.

Если вы только что создали новый пустой указатель объекта protobuf, в котором ничего нет, маршалированный байтовый массив не будет содержать никаких данных - поэтому вы получаете 0.

Я совершенно не уверен, что вы хотите, чтобы это вернулось.Не могли бы вы прояснить свой вопрос немного с тем, что вы хотите получить результат?Я могу лучше ответить на ваш вопрос.

...