5

Возможно ли, что DataContractSerializer ошибочно десериализует объект, если поля не находятся в «правильном» (что это означает) порядке?Сериализация/десериализация объектов - порядок полей?

Классы, которые я пытаюсь выполнить для сериализации/десериализации, не имеют атрибутов заказа, помещенных в поля/свойства. Однако одно из моих полей всегда десериализуется как null, хотя оно имеет ненулевое значение (оно фактически содержит список строк).

Когда я переместил два элемента XML в сериализованном файле вокруг, чтобы соответствовать порядку в другом примере XML (для которого десериализация работала без проблем), все приступило к работе.

Это не имеет никакого смысла для меня, но, возможно, кто-то знает лучше. ;)

ответ

13

Для правильной сериализации/сериализации с помощью DataContractSerializer все должно быть правдой.

  1. Класс, который должен быть сериализован, должен иметь SerializableAttribute или DataContractAttribute комплект;
  2. Для свойств и полей класса, который должен быть сериализован, требуется набор DataMemberAttribute;
  3. Тип данных сериализуемого свойства или поля должен быть сериализуемым (т. Е. Иметь общедоступный ctor и наследовать ISerializable);
  4. Класс, который должен быть сериализован, должен реализовывать IExtensibleDataObject;
  5. Примечание: сериализуемые поля могут быть как государственными, так и частными.
  6. Members must be in alphabetical order или вы должны использовать Order-propertyDataMemberAttribute.

Итак, порядок декларации делает дело. Если члены не в алфавитном порядке, они пропускаются. Посмотрите this answer at StackOverflow for an example, возможно, это относится к вашему делу.

+0

Начиная с .NET 3.5 SP1, первое и второе правила могут быть опущены. – JustAMartin

+0

@Martin: r u sure? Например, для веб-сервисов, требующих сериализации, они требуют «DataMemberAttribute», даже в .NET 4.0. У вас есть ссылка на ссылку? Мне было бы интересно узнать больше об этом (а затем обновить мой ответ). – Abel

+0

Ссылка в правиле 6 мертва – bkribbs

Смежные вопросы