У меня есть существующая кодовая база, которая сохраняет пару простых классов на диск через 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?