强制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:dateTime
types,生成的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);
我不知道这是否对序列化有任何影响