WS_STRUCT_DESCRIPTION struttura (webservices.h)
Informazioni sul tipo di struct C e su come esegue il mapping a un elemento XML. Questa operazione viene usata con WS_STRUCT_TYPE.
Sintassi
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;
Members
size
Dimensioni della struttura, in byte.
alignment
Requisito di allineamento della struttura. Questa deve essere una potenza di due tra 1 e 8.
fields
Matrice di puntatori alle descrizioni dei campi della struttura.
Per informazioni sull'ordinamento dei campi in questa matrice, vedere la sezione Osservazioni.
fieldCount
Numero di campi nella matrice dei campi. Qualsiasi parte della struttura che non è rappresentata da un campo verrà lasciata non inizializzata. Nessuna descrizione di due campi può fare riferimento allo stesso offset della struttura.
typeLocalName
Nome del tipo XML della struttura. Questa operazione viene usata solo quando le strutture derivano da altre strutture e possono essere NULL in caso contrario.
typeNs
Spazio dei nomi dei tipi XML della struttura. Questa operazione viene usata solo quando le strutture derivano da altre strutture e possono essere NULL in caso contrario.
parentType
Il tipo da cui deriva questo tipo. Questa operazione viene usata solo quando le strutture derivano da altre strutture e possono essere NULL in caso contrario.
subTypes
Matrice di puntatori ai tipi derivati. Questa operazione viene usata solo quando le strutture derivano da altre strutture e possono essere NULL in caso contrario.
subTypeCount
Numero di tipi nella matrice subTypes. Questa operazione viene usata solo quando le strutture derivano da altre strutture e possono essere NULL in caso contrario.
structOptions
Commenti
Di seguito è riportata la grammatica che descrive l'ordine dei campi all'interno di una struttura. L'ordine viene definito in base al campo di mapping di ogni 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
Si noti che le descrizioni dei campi di una struttura vengono serializzate e deserializzate nell'ordine specificato. Il processo di deserializzazione è "greedy", ovvero il contenuto corrispondente alla definizione verrà utilizzata una descrizione di campo specifica prima che venga considerata la descrizione del campo successiva. Questo approccio risolve qualsiasi ambiguità quando il contenuto potrebbe corrispondere alla descrizione del campo corrente o a quella seguente.
Il processo di deserializzazione è anche restrittivo. Tutto il contenuto deve essere deserializzato in base alle descrizioni dei campi. Per impostazione predefinita, tutti gli elementi e gli attributi non gestiti causeranno l'esito negativo del processo di deserializzazione. Tuttavia, il contenuto finale dell'elemento viene ignorato ed eliminato quando viene impostato WS_STRUCT_IGNORE_TRAILING_ELEMENT_CONTENT flag. Analogamente, gli attributi non gestiti vengono ignorati ed eliminati quando viene impostato WS_STRUCT_IGNORE_UNHANDLED_ATTRIBUTES flag.
Si noti che poiché le strutture WS_FIELD_DESCRIPTION determinano la posizione del campo effettivo all'interno della struttura usando un offset, non esiste alcuna restrizione in base all'ordine effettivo dei campi all'interno della struttura.
Quando una struttura deriva da (estende) un'altra, i campi per entrambe le strutture devono essere inclusi nella descrizione dello struct derivato e la grammatica precedente deve essere mantenuta. Ad esempio:
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
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows 7 [solo app desktop] |
Server minimo supportato | Windows Server 2008 R2 [solo app desktop] |
Intestazione | webservices.h |