2016-01-19 8 views
1

Простой объект 'персона' анализируется какСинтаксический RepeatedFields в proto3

  Person person = new Person 
      { 
       Id = 1, 
       Name = "Foo", 
       Email = "[email protected]", 
       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 <> разобраны?

EDIT: Вопрос в том, может ли RepeatedFields быть отправлен через провод или они должны быть связаны в сообщении, которое нужно передать?

+0

Я не уверен, что я понимаю ваш вопрос. 'Person' - это сообщение, но' repeat Person' является полем _in_ message, а не сообщением. Вы спрашиваете, можете ли вы писать/читать одну запись повторяющегося поля за раз? Если это так, я уверен, что ответ отрицательный, вы должны одновременно читать/писать целые сообщения. Если вы спрашиваете о внутренних синтаксических разборах ... не представляете, но вы всегда можете вникнуть в исходный код, если вам действительно интересно! – whrrgarbl

+0

Первый - я начал ошибочно думать, что повторное Лицо может быть отправлено как сообщение. Если вы добавите это в качестве ответа, я приму это. –

+1

добавлено, а также дополнительная информация, которую я обнаружил, так как мне было любопытно, как это работает под капотом :) – whrrgarbl

ответ

0

Person - это сообщение, поэтому вы можете читать и писать один экземпляр, как в вашем примере. repeated Person - это поле в сообщение, а не само сообщение. Вы не можете читать/писать повторяющееся поле, вам нужно читать/писать цельное сообщение за раз. (Глядя на the Python implementation, оказывается, что кодер должен знать, как долго сообщение для того, чтобы закодировать это правильно, так что это имеет смысл.)

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

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

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