Condividi tramite


Serializzazione

La serializzazione è il processo di scrittura di valori nelle strutture di dati C (struct, matrici e valori primitivi) come elemento XML. La deserializzazione è il processo inverso.

La serializzazione è il processo di scrittura di valori nelle strutture di dati C (strutture, matrici e valori primitivi) come elemento XML. La deserializzazione è il processo inverso.

Entrambi i processi si basano su una descrizione del mapping tra le strutture di dati C e il codice XML.

Diagramma che mostra come la serializzazione e la deserializzazione si basano su una descrizione del mapping tra le strutture di dati C e il codice XML.

Per serializzare un valore, l'applicazione chiama WsWriteElement, WsWriteAttribute o WsWriteType.

Per deserializzare un valore, l'applicazione chiama WsReadElement, WsReadAttribute o WsReadType.

Sicurezza

lettore XML viene usato nel processo di deserializzazione. Fare riferimento alla sezione relativa alla sicurezza in Lettore XML per informazioni di sicurezza correlate a XML.

Il deserializzatore continua a deserializzare i dati fino a quando non ha completato la lettura dell'elemento da deserializzare. Il processo di deserializzazione non riesce quando rileva un documento XML non conforme alla descrizione dei dati da deserializzare. A quel punto, il lettore XML utilizzato diventa non valido e viene restituito un errore.

Per impostazione predefinita, la deserializzazione è rigorosa. Alcune condizioni che causano l'esito negativo della deserializzazione includono, ad esempio:

  • Elementi previsti mancanti
  • I campi degli elementi imprevisti vengono visualizzati tra gli elementi obbligatori
  • Contenuto dell'elemento aggiuntivo dopo i campi obbligatori, a meno che il WS_STRUCT_IGNORE_TRAILING_ELEMENT_CONTENT
  • Attributi imprevisti, a meno che non venga specificato WS_STRUCT_IGNORE_UNHANDLED_ATTRIBUTES flag
  • Valore del tipo di dati imprevisto non compreso nell'intervallo specificato
  • Il numero di elementi ripetuti non rientra nell'intervallo specificato

La serializzazione di grandi quantità di dati può causare un'allocazione eccessiva di memoria e può causare attacchi Denial of Service. L'utente che sta deserializzando i dati deve specificare un oggetto Heap per allocare i dati e l'utente può usare il limite di allocazione dell'heap per evitare attacchi di allocazione della memoria.

Il supporto dell'intervallo per i tipi di dati, inclusa la lunghezza massima per la stringa, il numero massimo di elementi nella matrice e così via, consente all'utente di controllare le dimensioni massime per tipi di dati diversi. L'utente può specificare l'intervallo nella descrizione dei dati o nello schema per limitare le dimensioni massime di dati diversi.

Un valore stringa contenente uno zero incorporato è supportato nei formati di collegamento (testo, binario, MTOM). Quando si deserializza una stringa con uno zero incorporato, l'utente deve usare una stringa con conteggiata (WS_STRING) in modo che lo zero non confonda il calcolo della lunghezza della stringa. Se un valore stringa contenente uno zero incorporato viene deserializzato in un campo che prevede una stringa con terminazione zero, viene restituito un errore e la deserializzazione non riesce. Se wsutil viene usato per generare descrizioni dei dati, è consigliabile usare l'opzione /string:WS_STRING se è prevista la stringa con zero incorporato.

I callback seguenti vengono usati con la serializzazione:

Le enumerazioni seguenti vengono usate con la serializzazione:

Le funzioni seguenti vengono usate con la serializzazione:

Le strutture seguenti vengono usate con la serializzazione: