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 или есть что-то, что я могу сделать, чтобы изменить сгенерированный код С#?
Ответы
Ответ 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);
Что я не знаю, влияет ли это на сериализацию или нет на данный момент