На самом деле у меня есть такой класс
[DataContract]
public class Item : IExtensibleDataObject
{
[Browsable(false)]
public virtual ExtensionDataObject ExtensionData { get; set; }
[DataMember]
public string ID { get; set; }
[DataMember]
public string Name { get; set; }
public Item()
: this(String.Empty, String.Empty)
{ }
public Item(string id, string name)
{
ID = id ?? String.Empty;
Name = name ?? String.Empty;
}
}
Вы можете легко сериализовать и десериализовать его. Но теперь самое сложное:
Мне нужно переименовать свойство Name
в FullName
, и каждый новый сериализованный файл xml должен выходить с FullName
, тогда как в старых файлах все еще можно читать.
Вывести новое имя свойства в новый файл довольно просто. Просто переименуйте собственность, и все готово.
Для совместимости я бы пометил новое имя свойства [DataMember(Name="Name")]
, но в этом случае, если я запишу этот класс обратно в файл, я получу записанное старое имя.
Так что существует что-то в DataContract
, где я могу пометить свою собственность FullName
может быть, в два раза больше, чем
[DataMember(Name="Name")]
[DataMember]
public string FullName { get; set}
или есть какой-то другой механизм, как я могу показать, что оба значения могут быть записаны в это, но только одно выйдет при обратной записи?
Единственный способ, которым я могу представить, - это создать класс LegacyItem
, который не имеет функций или чего-то подобного, но выполняет старый DataContract
. Кроме того, какой-то неявный / явный оператор для преобразования моего LegacyItem
в Item
. И последнее, но не менее важное: при десериализации мне нужно сделать несколько тестов (может быть, просто try/catch
), чтобы узнать, какой класс я должен сказать DataContractSerializer
для чтения в файле.
Так что, даже если такой подход был бы возможен, он звучит несколько усложненным для этой задачи, и мне интересно, не существует ли уже чего-либо доступного в рамках, который бы немного облегчил эту задачу.