XML сериализация. Десериализовать и преобразовать в другой объект - PullRequest
0 голосов
/ 24 сентября 2010

У меня есть класс:

public class MyClass
{
    [XmlElement("Date")]
    public DateTime Date { get; set; }
}

XML был сериализован в файл:

var myClass = new MyClass() { Date = new DateTime(2010, 09, 24) };
new XmlSerializer(typeof(MyClass)).Serialize(fileStream, myClass);

Результат:

<MyClass>
    <Date>2010-09-24T00:00:00</Date>
</MyClass>

После этого был создан новый класс с указанием даты:

public class MyDate
{
    public int Year { get; set; }
    public int Month { get; set; }
    public int Date { get; set; }
}

И был использован в MyClass вместо System.DateTime:

public class MyClass
{
    [XmlElement("Date")]
    public MyDate Date { get; set; }
}

Мне нужно, чтобы следующий код работал нормально:

MyClass myClass = (MyClass)new XmlSerializer(typeof(MyClass)).Deserialize(fileStream);

Проблема в том, что я не могу изменить MyClass. Единственное, что я могу изменить, это класс MyDate и код сериализации / десериализации.

Как сделать код десериализации так, чтобы новый класс MyDate был десериализован из ранее сериализованного System.DateTime?

1 Ответ

0 голосов
/ 24 сентября 2010

Один из вариантов - реализовать IXmlSerializable в классе MyDate и затем проанализировать строку даты в методе ReadXml, используя XmlConvert.ToDateTime.

Если цель класса MyDate состоит в том, чтобы иметь другой формат XML, то вы могли бы поддерживать оба формата ввода в методе ReadXml, проверяя, что действительно присутствует в элементе, но всегда записывая вновый формат в методе WriteXml.

...