您好,我在反序列化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属性。
我可以使用相同的类进行序列化和反序列化吗?
答案 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);
}
}