estrutura WS_STRUCT_DESCRIPTION (webservices.h)

Informações sobre o tipo de struct C e como ele é mapeado para um elemento XML. Isso é usado com WS_STRUCT_TYPE.

Sintaxe

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;

Membros

size

O tamanho da estrutura em bytes.

alignment

O requisito de alinhamento da estrutura. Deve ser uma potência de dois entre 1 e 8.

fields

Uma matriz de ponteiros para as descrições dos campos da estrutura.

Consulte a seção Comentários para obter informações sobre a ordenação dos campos nesta matriz.

fieldCount

O número de campos na matriz de campos. Qualquer parte da estrutura que não é representada por um campo será deixada não inicializada. Nenhuma descrição de dois campos pode fazer referência ao mesmo deslocamento da estrutura.

typeLocalName

O nome do tipo XML da estrutura. Isso só é usado quando as estruturas derivam de outras estruturas e, caso contrário, podem ser NULL .

typeNs

O namespace de tipo XML da estrutura. Isso só é usado quando as estruturas derivam de outras estruturas e, caso contrário, podem ser NULL .

parentType

O tipo do qual esse tipo é derivado. Isso só é usado quando as estruturas derivam de outras estruturas e, caso contrário, podem ser NULL .

subTypes

Uma matriz de ponteiros para tipos derivados. Isso só é usado quando as estruturas derivam de outras estruturas e, caso contrário, podem ser NULL .

subTypeCount

O número de tipos na matriz subTypes. Isso só é usado quando as estruturas derivam de outras estruturas e, caso contrário, podem ser NULL .

structOptions

Comentários

Veja a seguir a gramática que descreve a ordem dos campos dentro de uma estrutura . A ordem é definida com base no campo de mapeamento de cada 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

Observe que as descrições de campos de uma estrutura são serializadas e desserializadas na ordem especificada. O processo de desserialização é "greedy", ou seja, quanto conteúdo corresponder à definição, uma descrição de campo específica será consumida antes que a próxima descrição do campo seja considerada. Essa abordagem resolve qualquer ambiguidade quando o conteúdo pode corresponder à descrição do campo atual ou a seguinte.

O processo de desserialização também é restritivo. Todo o conteúdo deve ser desserializado de acordo com as descrições do campo. Por padrão, todos os elementos e atributos sem tratamento farão com que o processo de desserialização falhe. No entanto, o conteúdo à direita do elemento é ignorado e descartado quando WS_STRUCT_IGNORE_TRAILING_ELEMENT_CONTENT sinalizador é definido. Da mesma forma, os atributos sem tratamento são ignorados e descartados quando WS_STRUCT_IGNORE_UNHANDLED_ATTRIBUTES sinalizador é definido.

Observe que, como as estruturas de WS_FIELD_DESCRIPTION determinam o local do campo real dentro da estrutura usando um deslocamento, não há nenhuma restrição quanto à ordem real dos campos dentro da estrutura.

Quando uma estrutura deriva de (estende) outra, os campos de ambas as estruturas devem ser incluídos na descrição do struct derivado e a gramática acima deve ser mantida. Por exemplo:

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

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 7 [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2008 R2 [somente aplicativos da área de trabalho]
Cabeçalho webservices.h