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

时间:2019-02-25 04:45:39

标签: c# serialization xmlignore

您好,我在反序列化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 :(得分:0)

反序列化时,

您的 FromDateTime ToDateTime 永远不会分配值。.

cal 属性中的

您的 set 并没有使用传递给它们的值做任何事情。

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

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

我只是猜测并说出您想要的是什么

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