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


структура WS_STRUCT_DESCRIPTION (webservices.h)

Сведения о типе структуры C и его сопоставлении с XML-элементом. Используется с WS_STRUCT_TYPE.

Синтаксис

typedef struct _WS_STRUCT_DESCRIPTION {
  ULONG                 size;
  ULONG                 alignment;
  WS_FIELD_DESCRIPTION  **fields;
  ULONG                 fieldCount;
  WS_XML_STRING         *typeLocalName;
  WS_XML_STRING         *typeNs;
  WS_STRUCT_DESCRIPTION *parentType;
  WS_STRUCT_DESCRIPTION **subTypes;
  ULONG                 subTypeCount;
  ULONG                 structOptions;
} WS_STRUCT_DESCRIPTION;

Члены

size

Размер структуры в байтах.

alignment

Требование выравнивания структуры. Это должно быть два значения в диапазоне от 1 до 8.

fields

Массив указателей на описания полей структуры.

Сведения о порядке полей в этом массиве см. в разделе Примечания.

fieldCount

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

typeLocalName

Имя типа XML структуры. Он используется только в том случае, если структуры являются производными от других структур, и в противном случае может иметь значение NULL .

typeNs

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

parentType

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

subTypes

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

subTypeCount

Количество типов в массиве subTypes. Он используется только в том случае, если структуры являются производными от других структур, и в противном случае может иметь значение NULL .

structOptions

Комментарии

Ниже приведена грамматика, описывающая порядок полей в структуре. Порядок определяется на основе поля сопоставления каждой WS_FIELD_DESCRIPTION.


Fields := TypeAttributeField? AttributeField* ContentFields UnmappedFields*
ContentFields := TextContentField | ElementContentFields
ElementContentFields := ElementContentField* ? AnyElementField?
ElementContentField := ElementField | RepeatingElementField | ElementChoiceField | RepeatingElementChoiceField
ElementField := WS_ELEMENT_FIELD_MAPPING
RepeatingElementField := WS_REPEATING_ELEMENT_FIELD_MAPPING
ElementChoiceField := WS_ELEMENT_CHOICE_FIELD_MAPPING
RepeatingElementChoiceField := WS_REPEATING_ELEMENT_CHOICE_FIELD_MAPPING
AnyElementField := WS_ANY_ELEMENT_FIELD_MAPPING
TextContentField := WS_TEXT_FIELD_MAPPING
UnmappedField := WS_NO_FIELD_MAPPING
TypeAttributeField := WS_TYPE_ATTRIBUTE_FIELD_MAPPING
AttributeField := WS_ATTRIBUTE_FIELD_MAPPING

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

Процесс десериализации также является ограничивающим. Все содержимое должно быть десериализовано в соответствии с описаниями полей. По умолчанию любые необработаемые элементы и атрибуты приводят к сбою процесса десериализации. Однако при установке флага WS_STRUCT_IGNORE_TRAILING_ELEMENT_CONTENT содержимое элемента игнорируется и удаляется. Аналогичным образом необработаенные атрибуты игнорируются и удаляются при установке флага WS_STRUCT_IGNORE_UNHANDLED_ATTRIBUTES .

Обратите внимание, что поскольку структуры WS_FIELD_DESCRIPTION определяют расположение фактического поля в структуре с помощью смещения, нет ограничений относительно фактического порядка полей в структуре.

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

struct BaseStructure
{
    const WS_STRUCT_DESCRIPTION* _type;
    int baseAttribute;
    int baseElement;
};

// BaseStructure field descriptions:
//    WS_TYPE_ATTRIBUTE_FIELD_MAPPING       // _type
//    WS_ATTRIBUTE_FIELD_MAPPING            // baseAttribute
//    WS_ELEMENT_FIELD_MAPPING              // baseElement

struct DerivedStructure
{
    struct BaseStructure _base;
    int derivedAttribute;
    int derivedElement;
};

// DerivedStructure field descriptions:
//    WS_TYPE_ATTRIBUTE_FIELD_MAPPING       // _type
//    WS_ATTRIBUTE_FIELD_MAPPING            // baseAttribute
//    WS_ATTRIBUTE_FIELD_MAPPING            // derivedAttribute
//    WS_ELEMENT_FIELD_MAPPING              // baseElement
//    WS_ELEMENT_FIELD_MAPPING              // derivedElement

Требования

Требование Значение
Минимальная версия клиента Windows 7 [только классические приложения]
Минимальная версия сервера Windows Server 2008 R2 [только классические приложения]
Верхняя часть webservices.h