Разбор RepeatedFields в прото3
Простой объект Person анализируется как
Person person = new Person
{
Id = 1,
Name = "Foo",
Email = "foo@bar",
Phones = { new Person.Types.PhoneNumber { Number = "555-1212" } }
};
using (MemoryStream stream = new MemoryStream())
{
// Save the person to a stream
person.WriteTo(stream);
bytes = stream.ToArray();
}
Person copy = Person.Parser.ParseFrom(bytes);
Как анализируется RepeatedField<>?
РЕДАКТИРОВАТЬ: Вопрос в том, если RepeatedFields могут быть отправлены через провод или они должны быть связаны в сообщении, которое будет передано?
1 ответ
Person
это сообщение, так что вы можете прочитать и написать один его экземпляр, как в вашем примере. repeated Person
это поле в сообщении, а не само сообщение. Вы не можете читать / писать повторяющиеся поля, вы должны читать / писать все сообщение за раз. (Глядя на реализацию Python, кажется, что кодировщику необходимо знать, как долго это сообщение, чтобы правильно его кодировать, поэтому это имеет смысл.)
Однако есть пара альтернатив сценарию, который вы описали:
Вы могли бы отправить кучу синглов
Person
сообщения, и собрать их вместе на принимающей стороне любым способом, который вам нужен.Вы можете определить сообщение, давайте назовем его
People
, содержащий одно полеrepeated Person
и напиши это сообщение. В документации по кодированию они отмечают, что оба соединяют строки двух сообщений или вызываютMessage::MergeFrom
Метод объединит повторяющиеся поля в сообщениях. Таким образом, вы можете отправить любое количествоPeople
сообщения и объединить или объединить их на принимающей стороне. Это даст вам одинPeople
сообщение, содержащее каждыйPerson
который был отправлен, без необходимости знать заранее, сколькоPerson
сообщения будут отправлены.