Дата десериализации C # XML не десериализована - PullRequest
0 голосов
/ 10 ноября 2018

У меня проблемы с десериализацией XML в C#. У меня есть следующее 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
}

Проблема в том, что свойство dateOfBirth в классе pet не заполняется при десериализации, и я не знаю почему. Это из-за конфликта имен со свойством dateOfBirth в классе person?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Мне удалось решить эту проблему с помощью атрибута [XmlElementAttribute(DataType = "date")] в поле dateOfBirth. Пересмотренный класс, который работает, выглядит следующим образом:

public class pet
{
    public string name { get; set; }
    [XmlElementAttribute(DataType = "date")]
    public DateTime dateOfBirth { get; set; }
}
0 голосов
/ 11 ноября 2018

Попробуйте следующий код, который использует 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); }
        }


    }
...