Какой итерационный метод использует protobuf- net при сериализации / десериализации перечислимого экземпляра? - PullRequest
0 голосов
/ 03 февраля 2020

Перечислимый экземпляр может быть из List, Dictionary, ConcurrentDictionary или из моего собственного класса.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Это удивительно сложный вопрос. Когда сериализует , он в основном просто использует foreach, то есть GetEnumerator() API - или перечисление на основе плоского индексатора для массивов. Когда десериализует , в основном пытается найти метод .Add(YourType t). Для словарей он будет искать любой из Add(KeyValuePair<TKey, TValue>), Add(TKey, TValue) или индексатор TValue this[TKey] (в частности, для "карт").

Однако! Реальность намного больше нюансов, чем это, так как нам также нужно подумать о ряде более сложных типов коллекций. Для 2.4. * Это очень , трудно поддающийся обработке, потому что это все время выполнения IL, однако: для ветви 3.0 вы можете увидеть некоторые из сценариев ios здесь - в частности см .:

  • RepeatedSerializer.cs
  • RepeatedSerializer.Immutable.cs
  • RepeatedSerializer.Concurrent.cs
  • MapSerializer.cs
  • MapSerializer.Immutable.cs
  • MapSerializer.Concurrent.cs

Обычно , однако: ответ: «это будет просто работать».

0 голосов
/ 03 февраля 2020

Если у вас есть класс с простым свойством IEnumerable, например:

[ProtoContract]
class Dummy
{
    [ProtoMember(1)]
    public IEnumerable<string> Values { get; set; }
}

Тогда, когда protobuf- net десериализует объект, фактический базовый объект будет List<T> - в этом случае, List<string>.

Для сериализации, если вы установите для нее полностью настраиваемую перечисляемую реализацию, protobuf- net просто перебирает ее как обычно и сериализует каждое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...