强制XmlSerializer将“DateTime”序列化为“YYYY-MM-DD hh:mm:ss”

我有一个RESTful服务的XSD模式。 当与xsd.exe工具一起使用来生成C#代码时,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; } } 

当使用XmlSerializer将XML反序列化为对象时,似乎都很好。 我面临的问题是,该服务预计date被格式化为YYYY-MM-DD hh:mm:ss和XSD生成的代码似乎只产生YYYY-MM-DD

如果我手动将XSD修改为xs:dateTimetypes,生成的C#代码将生成: 2010-08-20T20:07:03.915039Z

基本上,我如何强制序列化产生YYYY-MM-DD hh:mm:ss ? 有什么要做的XSD或有什么我可以做的改变生成的C#代码?

在过去,我已经做了以下控制date时间序列化:

  • 忽略DateTime属性。
  • 创build一个虚拟的string属性,以我想要的方式序列化/反序列化

这里是一个例子:

 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); } } } 

根据需要使用[XmlElement(DataType = "date")]属性来格式化您的DateTime属性值。

来自MSDN :

注意:
注释publicationdate字段的属性具有DataType属性。 .NET Framework中没有types完全匹配typesxs:date。 最接近的匹配是System.DateTime,它存储date和时间数据。 将DataType属性指定为“date”可确保XmlSerializer只能序列化DateTime对象的date部分。

我相信实现IXmlSerializable接口将有一个窍门。 然后,您可以控制如何序列化和反序列化您的对象。

如果你只需要清除毫秒部分。 参考:

如何截断.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); 

我不知道这是否对序列化有任何影响