5

Czy to możliwe, że DataContractSerializer nieprawidłowo deserializuje obiekt, jeśli pola nie znajdują się w "poprawnej" (cokolwiek to znaczy) kolejności?Szereguj/deserializuj obiekty - kolejność pól jest ważna?

Klasy, które próbuję serializować/deserializować, nie mają atrybutów zleceń umieszczonych w polach/właściwościach. Jednak jedno z moich pól zawsze jest przekształcane w postaci szeregowej jako null, mimo że ma wartość inną niż null (w rzeczywistości zawiera listę ciągów znaków).

Kiedy przeniosłem dwa elementy XML w pliku szeregowym, aby dopasować kolejność w innym przykładzie XML (dla którego deserializacja działała bez problemów) wszystko zaczęło działać.

To nie ma dla mnie sensu, ale może ktoś wie lepiej. ;)

Odpowiedz

13

Aby być poprawnym serializowaniem/serializacją przez DataContractSerializer, wszystkie poniższe muszą być prawdziwe.

  1. Klasa, która musi być serializowana, musi mieć zestaw SerializableAttribute lub DataContractAttribute;
  2. Właściwości i pola klasy, które muszą być serializowane wymagają zestawu DataMemberAttribute;
  3. Typ danych z serializowalnej właściwości lub pola musi być możliwy do szeregowania (to znaczy mieć publicznego ctor i dziedziczyć ISerializable);
  4. Klasa, która musi być serializowana, musi implementować IExtensibleDataObject;
  5. Uwaga: Pola serializowalne mogą być publiczne lub prywatne.
  6. Members must be in alphabetical order lub powinieneś użyć Order-property z DataMemberAttribute.

Więc kolejność zgłoszenia robi sprawę. Jeśli członkowie nie są w porządku alfabetycznym, są pomijani. Wyszukaj numer this answer at StackOverflow for an example, może dotyczy to Twojego przypadku.

+0

Od wersji .NET 3.5 SP1 można pominąć pierwszą i drugą regułę. – JustAMartin

+0

@Martin: r czy na pewno? Na przykład dla usług WWW, które wymagają serializacji, wymagają 'DataMemberAttribute', nawet w .NET 4.0. Czy masz link do referencji? Chciałbym przeczytać więcej na ten temat (a następnie zaktualizować moją odpowiedź). – Abel

+0

Link w przepisie 6 jest martwy – bkribbs

Powiązane problemy