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

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

8
задан Avner Shahar-Kashtan 26 March 2012 в 10:09
поделиться