【问题标题】:C# XML Deserializer Not Deserializing DateC# XML 反序列化器不反序列化日期
【发布时间】:2018-11-10 16:41:39
【问题描述】:

我在 C# 中的 XML 反序列化时遇到问题。 我有以下XML

<?xml version="1.0" encoding="utf-8"?>
<head>
  <person>
    <name>Jim Bob</name>
    <dateOfBirth>1990-01-01</dateOfBirth>
  </person>
  <policy>
    <number>1</number>
    <pet>
      <name>Snuffles</name>
      <dateOfBirth>2000-01-01</dateOfBirth>
    </pet>
  </policy>
</head>

有了这个,我试图将它映射到以下类:

public class head
{
    public policy policy { get; set; }
    public person person { get; set; }
}

public class person
{
    public string name { get; set; }
    public DateTime dateOfBirth { get; set; }

    [XmlElement("policy")]
    public List<policy> policy { get; set; }
}

public class policy
{
    public string number { get; set; }
    [XmlElement("pet")]
    public List<pet> pet { get; set; }
}

public class pet
{
    public string name { get; set; }
    [XmlElement("dateOfBirth")]
    public DateTime dateOfBirth { get; set; } //<~~ Issue is with this property
}

问题是pet 类中的dateOfBirth 属性在反序列化时没有被填充,我不知道为什么。这是因为与person 类中的dateOfBirth 属性的命名冲突吗?

【问题讨论】:

  • 您的head 类是否应该包含policy 属性?
  • 问题在于 1) 您在 head 上缺少 public policy policy { get; set; } 和 2) [XmlElememnt("dateOfBirth")] 拼写错误并且无法编译。修复那些你的代码工作,见dotnetfiddle.net/5veH6q
  • @dbc 谢谢,我已经更新了这个问题,因为这是一个快速输入的问题示例。我已纠正错字/缺失的属性,因为它们存在于完整代码中。
  • 好的,但现在我无法重现该问题,请参阅dotnetfiddle.net/5veH6q&lt;dateOfBirth&gt;2000-01-01&lt;/dateOfBirth&gt; 似乎填充成功。
  • @dbc 好的,谢谢,我已经通过同一个小提琴运行了我的完整代码,我得到了同样的错误。无论如何,您已经回答了我的问题,这不是命名冲突。我会继续挑剔它!谢谢

标签: c# xml deserialization


【解决方案1】:

尝试以下使用 ParseExact 的代码。如果您仍然遇到问题,您可能必须处理 DateTime 为空的情况:

    public class pet
    {
        public string name { get; set; }
        private DateTime _dateOfBirth { get; set; } //<~~ Issue is with this property

        [XmlElement("dateOfBirth")]
        public string DateOfBirth
        {
            get { return _dateOfBirth.ToString("yyyy-MM-dd"); }
            set { _dateOfBirth = DateTime.ParseExact(value, "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture); }
        }


    }

【讨论】:

    【解决方案2】:

    我设法通过在dateOfBirth 字段上使用[XmlElementAttribute(DataType = "date")] 属性解决了这个问题。修改后的类如下所示:

    public class pet
    {
        public string name { get; set; }
        [XmlElementAttribute(DataType = "date")]
        public DateTime dateOfBirth { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-12
      • 2016-04-16
      • 2012-02-02
      • 2011-06-24
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      相关资源
      最近更新 更多