Изменить сигнатуру класса, обработать старые сериализованные экземпляры xml - PullRequest
0 голосов
/ 06 августа 2010

Предположим, у меня есть такой класс:

public class SomeObject
{
    public Guid InternalId { get; set; }
    public string Address { get; set; }
}

Я храню экземпляры этого объекта в профиле ASP.NET.Он получает сериализованный XML, и все в порядке.Теперь я хочу уменьшить размер профиля и заменить имена свойств long на что-то более короткое:

public class SomeObject
{
    [XmlElement("id")]
    public Guid InternalId { get; set; }
    [XmlElement("ad")]
    public string Address { get; set; }
}

Новые объекты сериализуются очень хорошо, коротко, и все,Однако XmlSerializer не может десериализовать старые файлы XML.Есть ли какой-нибудь хук, который я могу применить, чтобы изменить сигнатуру классов, но все же быть в состоянии десериализовать старые экземпляры.

У меня есть обработчик событий XmlSerializer_UnknownElement, и тогда я могу сам установить значение целевого свойстваУ меня есть только значение элемента в виде строки, поэтому я должен проанализировать его самостоятельно, что весьма подвержено ошибкам.

1 Ответ

1 голос
/ 06 августа 2010

Два ответа, один я знаю, сработает, другой я не уверен.

1) Реализуйте интерфейс IXmlSerializable в своем классе. Это очень легко сделать и дает вам полный контроль над сериализацией и десериализацией класса.

http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx

2) Не уверен, что это будет работать, но попробуйте добавить еще один тег XmlElementAttribute в свойства вашего класса. Он компилируется, но я не уверен, что это сработает.

public class SomeObject
{
    [XmlElement("InternalId")]
    [XmlElement("id")]
    public Guid InternalId { get; set; }
    [XmlElement("Address")]
    [XmlElement("ad")]
    public string Address { get; set; }
}
...