Поделиться через


Сериализация

Сериализация — это процесс записи значений в структурах данных C (структуры, массивы и примитивные значения) в виде XML-элемента. Десериализация является обратным процессом.

Сериализация — это процесс записи значений в структуры данных C (структуры, массивы и примитивные значения) в виде XML-элемента. Десериализация является обратным процессом.

Оба процесса основаны на описании сопоставления между структурами данных C и XML.

Схема, показывающая, как сериализация и десериализация зависят от описания сопоставления между структурами данных C и XML.

Чтобы сериализовать значение, приложение вызывает WsWriteElement, WsWriteAttribute или WsWriteType.

Для десериализации значения приложение вызывает WsReadElement, WsReadAttribute или WsReadType.

Безопасность

Средство чтения XML используется в процессе десериализации. Сведения о безопасности, связанные с XML, см. в разделе о безопасности в средстве чтения XML.

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

По умолчанию десериализация является строгой. Некоторые условия, которые приводят к сбою десериализации, включают, помимо прочего, следующие:

  • Отсутствуют ожидаемые элементы
  • Между обязательными элементами отображаются непредвиденные поля элементов
  • Дополнительное содержимое элемента после обязательных полей, если только WS_STRUCT_IGNORE_TRAILING_ELEMENT_CONTENT
  • Непредвиденные атрибуты, если не указан флаг WS_STRUCT_IGNORE_UNHANDLED_ATTRIBUTES
  • Непредвиденное значение типа данных, которое выходит за пределы указанного диапазона
  • Число повторяющихся элементов выходит за пределы указанного диапазона

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

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

Строковое значение, содержащее внедренное ноль, поддерживается в форматах провода (text, binary, MTOM). При десериализации строки с внедренным нулевым значением пользователь должен использовать подсчитываемую строку (WS_STRING), чтобы нуль не путал вычисление длины строки. Если строковое значение, содержащее внедренный нуль, десериализуется в поле, ожидающее строку с нулем, возвращается ошибка и десериализация завершается сбоем. Если wsutil используется для создания описаний данных, следует использовать параметр /string:WS_STRING, если ожидается строка со встроенным нулевым значением.

При сериализации используются следующие обратные вызовы:

При сериализации используются следующие перечисления:

При сериализации используются следующие функции:

Для сериализации используются следующие структуры: