Подтвердить что ты не робот

Force XmlSerializer сериализовать DateTime как "YYYY-MM-DD hh: mm: ss"

У меня есть схема XSD для некоторого сервиса RESTful. При использовании в сочетании с инструментом xsd.exe для генерации кода С# XSD xs:date генерирует следующий код:

[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="date")]
public System.DateTime time {
    get {
        return this.timeField;
    }
    set {
        this.timeField = value;
    }
}

При десериализации XML-объектов с помощью XmlSerializer все выглядит хорошо. Проблема, с которой я сталкиваюсь, заключается в том, что служба ожидает, что даты будут отформатированы как YYYY-MM-DD hh:mm:ss, а сгенерированный код XSD, по-видимому, будет производить только YYYY-MM-DD.

Если я модифицирую XSD вручную до типа xs:dateTime, сгенерированный код С# создает: 2010-08-20T20:07:03.915039Z.

В принципе, как заставить сериализацию производить YYYY-MM-DD hh:mm:ss? Есть что-то делать с XSD или есть что-то, что я могу сделать, чтобы изменить сгенерированный код С#?

4b9b3361

Ответ 1

В прошлом я использовал следующее для управления сериализацией datetime:

  • Игнорировать свойство DateTime.
  • Создайте свойство фиктивной строки, которое сериализует/десериализует способ, которым я хочу

Вот пример:

public class SomeClass
{
    [XmlIgnore]
    public DateTime SomeDate { get; set; }

    [XmlElement("SomeDate")]
    public string SomeDateString
    {
        get { return this.SomeDate.ToString("yyyy-MM-dd HH:mm:ss"); }
        set { this.SomeDate = DateTime.Parse(value); }
    }
}

Ответ 2

Используйте атрибут [XmlElement(DataType = "date")] для форматирования значения свойства DateTime, как вам нужно.

Из MSDN:

Примечание:
Атрибут, который аннотирует поле publishdate, имеет Свойство DataType. В .NET Framework нет типа, который соответствует тип xs: дата полностью. Самое близкое совпадение - System.DateTime, который хранит данные о дате и времени. Указание свойства DataType как "date" гарантирует, что XmlSerializer будет сериализовать дату часть объекта DateTime.

Ответ 3

Я считаю, что интерфейс IXmlSerializable будет делать трюк. Затем вы можете контролировать, как вы сериализуете и десериализуете свой объект.

Ответ 4

Если вам нужно только очистить миллисекунду. См. Также:

Как урезать миллисекунды с .NET DateTime

И в основном делайте что-то вроде:

  startDateTimeToUse = startDateTimeToUse.AddTicks(-(startDateTimeToUse.Ticks % TimeSpan.TicksPerSecond));
  endDate = endDate.AddTicks(-(endDate.Ticks % TimeSpan.TicksPerSecond));

Я могу подтвердить, что это сериализуется:

            <startDate>2015-10-31T12:13:04</startDate>
            <endDate>2016-11-10T12:13:06</endDate>

Я также должен указать, что перед очисткой миллисекунд я делаю это:

            var startDateTimeToUse = ssStartDateTime.ToUniversalTime();
            var endDate = DateTime.Now.ToUniversalTime();
            startDateTimeToUse = DateTime.SpecifyKind(startDateTimeToUse, DateTimeKind.Unspecified);
            endDate = DateTime.SpecifyKind(endDate, DateTimeKind.Unspecified);

Что я не знаю, влияет ли это на сериализацию или нет на данный момент