繁体   English   中英

C#xml使用XmlIgnore进行序列化和反序列化问题

[英]C# xml Serialize with XmlIgnore and Deserialize problem

您好,我对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);            
    }

现在,我获得仅包含FromDateTimeCal和ToDateTimeCal的XML文件

但是问题是当我反序列化它们时开始的。

我对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属性。

我可以使用同一类进行序列化和反序列化吗?

反序列化时,永远不会为您的FromDateTimeToDateTime分配值。

您在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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM