5

E 'possibile che DataContractSerializer deserializzi erroneamente un oggetto se i campi non sono nell'ordine "corretto" (qualunque cosa ciò significhi)?Serializzare/deserializzare oggetti - l'ordine dei campi è importante?

Le classi che tento di serializzare/deserializzare non hanno attributi di ordine posizionati su campi/proprietà. Tuttavia uno dei miei campi viene sempre deserializzato come null anche se ha un valore non nullo (in realtà contiene un elenco di stringhe).

Quando mi sono trasferito due elementi XML nel file serializzato in giro per abbinare l'ordine di un altro esempio di XML (per il quale deserializzazione ha funzionato senza problemi) tutto ha iniziato a lavorare.

Questo non ha senso per me, ma forse qualcuno lo sa meglio. ;)

risposta

13

Per essere ammissibili al corretto serializzazione/serializzazione dal DataContractSerializer, tutte le seguenti deve essere vera.

  1. La classe che deve essere serializzata deve avere SerializableAttribute o DataContractAttribute impostato;
  2. Le proprietà e i campi della classe che devono essere serializzati richiedono il set DataMemberAttribute;
  3. Il tipo di dati della proprietà o campo serializzabile deve essere serializzabile (vale a dire, avere un ctor pubblico ed ereditare ISerializable);
  4. La classe che deve essere serializzata deve implementare IExtensibleDataObject;
  5. Nota: i campi serializzabili possono essere pubblici o privati.
  6. Members must be in alphabetical order oppure utilizzare lo Order-property dello DataMemberAttribute.

Così, l'ordine della dichiarazione fa importa. Se i membri non sono in ordine alfabetico, vengono saltati. Cerca this answer at StackOverflow for an example, forse si applica al tuo caso.

+0

A partire da. NET 3.5 SP1, la prima e la seconda regola possono essere omesse. – JustAMartin

+0

@ Martin: sei sicuro? Ad esempio, per i servizi Web, che richiedono la serializzabilità, richiedono 'DataMemberAttribute' ancora, anche in .NET 4.0. Hai un link a un riferimento? Sarei interessato a saperne di più su questo (e poi aggiornare la mia risposta). – Abel

+0

Il collegamento nella regola 6 è morto – bkribbs

Problemi correlati