C # xml Сериализация с проблемой XmlIgnore и десериализации - PullRequest
0 голосов
/ 25 февраля 2019

Здравствуйте, у меня проблема с десериализацией xml

Сначала у меня есть такой класс

public class ReportsViewModel
{
    private DateTime fromDateTime;
    [XmlIgnore]
    public DateTime FromDateTime
    {
        get { return fromDateTime; }
        set
        {
            fromDateTime = value;

        }
    }
    [XmlElement]
    public int FromDateTimeCal
    {
        get
        {
            return fromDateTime.Subtract(DateTime.Today).Days;
        }
        set
        {
            var a = fromDateTime.Subtract(DateTime.Today).Days;
            a = value;
        }
    }

    private DateTime toDateTime;
    [XmlIgnore]
    public DateTime ToDateTime
    {
        get { return toDateTime; }
        set
        {
            toDateTime = value;

        }
    }
    [XmlElement]
    public int ToDateTimeCal
    {
        get
        {
            return ToDateTime.Subtract(DateTime.Today).Days;
        }
        set
        {
            var a = ToDateTime.Subtract(DateTime.Today).Days;
            a = value;
        }
    }
}

А потом я сериализую их

ReportsViewModel reportVM = new ReportsViewModel();
    reportVM.FromDateTime = new DateTime(2019, 02, 18);
    reportVM.ToDateTime = new DateTime(2019, 02, 22);
    using (StreamWriter sw = new StreamWriter(@"D:\Temp\Report.xml"))
    {           
        XmlSerializer xml = new XmlSerializer(typeof(ReportsViewModel));
        xml.Serialize(sw, reportVM);            
    }

Теперь я получаю файл XMLкоторые содержат только FromDateTimeCal и ToDateTimeCal

, но проблема начинается, когда я десериализую их.

Я использую десериализацию с классом ReportViewModel

using (StreamReader sw = new StreamReader(@"D:\Temp\Report.xml"))
            {
                XmlSerializer xml = new XmlSerializer(typeof(ReportsViewModel));
                ReportsViewModel reportVM = (ReportsViewModel)xml.Deserialize(sw);
                reportVM.Dump();
                reportVM.FromDateTimeCal.Dump();
                reportVM.ToDateTimeCal.Dump();
            }   

Это не сработало.Я предполагаю, что проблема в том, что свойство FromDateTime и ToDateTime не было установлено.

Можно ли сериализовать и десериализовать с одним и тем же классом?

1 Ответ

0 голосов
/ 25 февраля 2019

вашим FromDateTime и ToDateTime никогда не присваивается значение при десериализации ..

ваш набор внутри вашего cal свойства ничего не делают с переданным им значением.

var a = fromDateTime.Subtract(DateTime.Today).Days;
            a = value;

эта строка хранит значение и вычисленное значение внутри этого блока, но никогда не пересылает вычисленное значение.

imсобираюсь просто угадать и сказать, что вы хотите, это что-то вроде:

var a = value.Subtract(DateTime.Today).Days;
            ToDateTime = a;

, но тогда вы столкнетесь с проблемой.когда вы получите значение ToDateTimeCal и FromDateTimeCal , вы снова выполните тот же расчет для уже рассчитанного значения.Поскольку вы используете текущую дату в расчете и никогда не сохраняете эту дату в файле - у вас нет способа отменить значение, чтобы выяснить, что было FromDateTime .Если вы не читаете дату из самого файла.Вместо этого было бы разумнее сериализовать FromDateTime .Но если исходная дата, используемая в расчете, не нужна, возможно, вы можете сделать что-то вроде:

 [XmlIgnore]
public DateTime FromDateTime
{
    get { return fromDateTime; }
    set
    {
        fromDateTime = value;

    }
}
[XmlElement]
public int FromDateTimeCal
{
    get
    {
        return fromDateTime.Subtract(DateTime.Today).Days;
    }
    set
    {
        fromDateTime = DateTime.Today.AddDays(value);
    }
}
...