C# xml Serialize with XmlIgnore and Deserialize 问题

C# xml Serialize with XmlIgnore and Deserialize problem

你好我有反序列化的问题xml

首先我有 class 这样的

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 进行反序列化 class

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 属性 没有设置。

我可以使用相同的序列化和反序列化 class 吗?

你的 FromDateTimeToDateTime 在反序列化时永远不会被赋值..

你的 set 在你的 cal 属性中没有对传递给它们的值做任何事情。

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

该行将值和计算值保留在该块内,但从不转发计算值。

我只是猜测并说出你想要的是这样的:

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

但是你会 运行 进入一个问题。当您获得 ToDateTimeCalFromDateTimeCal 的值时,您将根据已计算的值再次 运行 相同的计算。由于您在计算中使用的是当前日期,并且您从不将该日期保存在文件中 - 您没有办法反转该值来确定 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);
    }
}