Protobuf не сериализует значения по умолчанию

Я использую Protobuf для Python.

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

Например,

вот мой объект.proto file

message Test{

    optional string lol = 1 [default="HI"];
    optional int32 num = 2 [default=200];
}

я бегу

test = packets_pb2.Test()
print(test.num)
print(test.SerializeToString())

и получить 200 для печати (test.num), но нет результатов (пусто) для SerializeToString()

Я хочу, чтобы мои значения по умолчанию были сериализованы.

Есть идеи, как это сделать?

Заранее спасибо.

1 ответ

Решение

Это работает как задумано. Значения по умолчанию не отправляются по проводам. Вместо этого принимающая сторона предполагает, что если поле отсутствует, то оно должно использовать значение по умолчанию. Это экономит место на проводе, не посылая общие значения. Это означает, что клиент и сервер должны согласовать значения по умолчанию; как правило, вы не должны изменять значения по умолчанию в вашем .proto файлы.

Имейте в виду, что основная цель значений по умолчанию состоит в том, чтобы иметь возможность обрабатывать сообщения от старых клиентов, которые были созданы до появления поля. Таким образом, эти клиенты явно не могут отправить значение по умолчанию на провод, так как они ничего не знают об этом.

Для всех, кто использует Protobuf 3, есть способ сериализовать значения по умолчанию, используя including_default_value_fields аргумент MessageToDict или MessageToJson:

from google.protobuf.json_format import MessageToJson

serialized_message_with_defaults = MessageToJson(
    protobuf_instance,
    including_default_value_fields=True,  # this does it
)
Другие вопросы по тегам