Разбор 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, кажется, что кодировщику необходимо знать, как долго это сообщение, чтобы правильно его кодировать, поэтому это имеет смысл.)

Однако есть пара альтернатив сценарию, который вы описали:

  1. Вы могли бы отправить кучу синглов Person сообщения, и собрать их вместе на принимающей стороне любым способом, который вам нужен.

  2. Вы можете определить сообщение, давайте назовем его People, содержащий одно поле repeated Person и напиши это сообщение. В документации по кодированию они отмечают, что оба соединяют строки двух сообщений или вызывают Message::MergeFrom Метод объединит повторяющиеся поля в сообщениях. Таким образом, вы можете отправить любое количество People сообщения и объединить или объединить их на принимающей стороне. Это даст вам один People сообщение, содержащее каждый Person который был отправлен, без необходимости знать заранее, сколько Person сообщения будут отправлены.

Другие вопросы по тегам