Что представляют собой все эти записи коллекции null в моем DataContract XML?

StackOverflow https://stackoverflow.com/questions/2501886

Вопрос

Кто-нибудь знает, почему NetDataContractSerializer может добавлять записи "nil" в сериализованную коллекцию?

Например,

  <Jobs z:Id="17">
    <_items z:Id="18" z:Size="4">
      <JobRecord z:Id="19">
        <Name z:Id="20">Job1</Name>
      </JobRecord>
      <JobRecord i:nil="true" />
      <JobRecord i:nil="true" />
      <JobRecord i:nil="true" />
    </_items>
    <_size>1</_size>
    <_version>2</_version>
  </Jobs>

Обратите внимание на три дополнительные записи "JobRecord" и дополнительный элемент, говорящий "эй, я знаю, что здесь четыре узла, но только один из них что-то значит".

Это кажется странным поведением.Итак, я мог видеть, что NDCS глубоко проникает в граф объектов и, возможно, работает с резервным массивом, размер которого превышает количество сериализуемых элементов (подумайте о резервном массиве для списка).

Это то, что здесь происходит?Является ли это артефактом класса, который конструктор создает для обработки yield return (который является источником записи задания)?

Это было полезно?

Решение

В .net коллекции и списки работают путем автоматического изменения размера, когда в них заканчивается место.Чтобы сделать это эффективным, они не просто изменяют размер на 1 дополнительный каждый раз, когда заканчиваются, они используют внутренний алгоритм для изменения размера и оставляют немного дополнительного места, цель которого состоит в том, чтобы им не приходилось изменять размер слишком часто.

То, что вы видите здесь, - это сериализуемая коллекция со всем дополнительным пространством, которое также сериализуется.это происходит потому, что сериализация сохраняет коллекцию точно такой, какая она есть, поэтому, когда вы ее десериализуете, вы получаете то же самое обратно, с тем же количеством оставшегося внутреннего пространства.

Если это Список, который вы используете, вы можете проверить внутренне зарезервированное пространство, просмотрев Capacity собственность.

Если вы хотите удалить лишнее пространство перед сериализацией коллекции, вы можете вызвать.

myStuff.Capacity = myStuff.Count;

При этом доступная емкость будет равна количеству содержащихся элементов, поэтому зарезервированного места не будет.

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

В любом случае, я бы не стал слишком беспокоиться об этом, если только вам не нужно действительно экономить пространство.Если вы это сделаете, используйте вместо этого массив фиксированного размера.

Другие советы

Просто предположение, но обратите внимание на z:Size="4".Выглядит как четыре JobRecord записи для меня, и я предполагаю, что три из них = null.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top