Необязательные свойства при десериализации DataContract / Serializable mish-mash - PullRequest
7 голосов
/ 26 марта 2012

У меня есть существующая кодовая база, которая сохраняет пару простых классов на диск через NetDataContractSerializer, но, к сожалению, классы не украшены [DataContract], а скорее [Serializable].Это прекрасно работает, но теперь я хочу добавить несколько новых свойств в сохраненные классы, но при этом иметь возможность читать файлы, сгенерированные старой версией.

Допустим, это класс:

[Serializable]
public class Persisted
{
    public int OldProperty {get;set;}
    public int NewProperty {get;set;}
}

Теперь, когда я десериализирую старые файлы, я получаю исключение, потому что они не содержат NewProperty.Это имеет смысл.Поэтому я хотел игнорировать NewProperty, но хотя есть атрибут [OptionalField], позволяющий сериализатору игнорировать пропущенное поле, его нельзя применить к свойствам - только к полям.

Поэтому я решил, чтоЯ буду использовать [DataContract] и [DataMember], который также имеет свойство IsRequired, но это меняет компоновку сериализованного файла и не может читать старые файлы данных.Более того, вы не можете смешивать [Serializable] и [DataMember] - если сериализатор видит атрибут [Serializable], он игнорирует директивы [DataMember].

Таким образом, исключая возможность одноразового выполненияпреобразование старых файлов (возможно, но не мой первый выбор), есть ли способ заставить NetDataContractSerializer игнорировать поле в существующем сериализованном объекте XML?

1 Ответ

4 голосов
/ 22 апреля 2012

Проблема в том, что при использовании атрибута Serializable сериализуются поля , а не свойства.Поскольку вы используете авто-свойства, поля скрыты, и вы не можете добавлять к ним атрибуты.

Решение простое - не используйте авто-свойства.

...