Порядок десериализации в protobuf-сети - PullRequest
1 голос
/ 10 января 2012

Каков порядок десериализации членов в protobuf-net?Это в порядке номеров тегов, в порядке объявления, что-то еще, или не гарантируется?

Я полагаюсь на это для моего решения проблемы, когда protobuf-net не поддерживает большинство типов зубчатыхмассивы.У меня есть пользовательский класс LinearAdapter, который представляет зубчатый массив как IEnumerable<T> (с методом Add).Мое основное представление данных дополнено нулями по бокам, с переменным размером заполнения, поэтому при десериализации в LinearAdapter я сначала читаю уже десериализованный размер заполнения, поэтому могу правильно десериализовать массив.

1 Ответ

1 голос
/ 11 января 2012

Ваш заголовок спрашивает о десериализации - для которого ответ обычно "в том порядке, в котором они встречаются в потоке" - т.е. он назначает данные непосредственно членам (или добавляет в списки) так, как он их видит , В частности, списки обрабатываются следующим образом

  • (читать заголовок, который отображается в поле списка)
    • получить существующий список от участника или создать новый
    • [*] чтение значения из потока
    • добавить в список
    • заглядывать в следующем заголовке; если то же поле, использовать заголовок и возобновить с [*]
    • присваивать список члену при необходимости

одиночные базовые значения, с другой стороны, обрабатываются как:

  • (читать заголовок, который отображается в поле значения)
    • чтение значения из потока
    • присвоить значение элементу

(примечание не зацикливается)

больше сложные значения (объекты) будут обработаны как:

  • (читать заголовок, который отображается в поле объекта)
    • чтение существующего объекта из члена
    • объединить подобъект из подпотока или создать новый объект, если тривиально
    • присваивать объект члену при необходимости

Существует тонкое исключение из этого, в случае «подобных кортежу» данных (с неявными контрактами), где по причинам реализации все значения хранятся в локальных элементах до тех пор, пока не будет использован поток объекта, а затем конструктор вызывается (порядок параметров в конструкторе неявно здесь упорядочен по тегу):

  • подготовить локальную переменную для каждого поля (значения по умолчанию и т. Д.)
  • потребляет подпоток, с логикой, как указано выше, но назначая локальные переменные, а не члены
  • вызвать конструктор

Если вы имеете в виду «как он сериализуется», то он сериализуется в порядке возрастания тегов (в соответствии с указаниями в спецификации проводов) - однако, здесь делается небольшое исключение в случае наследования (которое он реализует на провод через подобъект для подкласса).

...