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
)