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