如何序列化到dateTime

努力获取任何时区的DateTimes。 我正在使用DateTimeOffset,一个字符串和一个XmlElement属性。 当我这样做时,我收到以下错误:

[InvalidOperationException:’dateTime’是XmlElementAttribute.DataType属性的无效值。 dateTime无法转换为System.String。]
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model,String ns,ImportContext context,String dataType,XmlAttributes a,Boolean repeats,Boolean openModel,RecursionLimiter limiter)+450

[InvalidOperationException:反映类型’System.String’的错误。]
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model,String ns,ImportContext context,String dataType,XmlAttributes a,Boolean repeats,Boolean openModel,RecursionLimiter limiter)+1621
System.Xml.Serialization.XmlReflectionImporter.ImportAccessorMapping(MemberMapping访问器,FieldModel模型,XmlAttributes a,String ns,Type choiceIdentifierType,Boolean rpc,Boolean openModel,RecursionLimiter limiter)+8750
System.Xml.Serialization.XmlReflectionImporter.ImportFieldMapping(StructModel parent,FieldModel model,XmlAttributes a,String ns,RecursionLimiter limiter)+139
System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping,StructModel model,Boolean openModel,String typeName,RecursionLimiter limiter)+1273

[InvalidOperationException:反映属性’creationTimeX’时出错。] …

码:

[System.Xml.Serialization.XmlElement(ElementName = "creationTime", DataType="dateTime")] public string creationTimeX { get { return this.creationTimeField.ToString("yyyy-MM-ddTHH:mm:sszzz"); } set { DateTimeOffset.TryParse(value, out this.creationTimeField); } } [System.Xml.Serialization.XmlIgnoreAttribute()] public System.DateTimeOffset creationTime { get { return this.creationTimeField; } set { this.creationTimeField = value; } } 

看一下有关序列化日期和UTC的StackOverflow问题:

.Net framework 3.5 / SQL Server 2008中DateTime序列化的最佳实践

无需仅为完成序列化而创建特殊属性。

这对我有用

 private const string DateTimeOffsetFormatString = "yyyy-MM-ddTHH:mm:sszzz"; private DateTimeOffset eventTimeField; [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)] public string eventTime { get { return eventTimeField.ToString(DateTimeOffsetFormatString); } set { eventTimeField = DateTimeOffset.Parse(value); } } 

使用XmlConvert.ToDateTimeOffset()和.ToString()方法在XmlSerializer变通方法属性中正确序列化和反序列化DateTimeOffset。

这里的Microsoft Connect文章中的完整示例,以及不幸的是Microsoft不会修复此疏忽的确认(它应该由XmlSerializer本身支持为任何原始类型):

https://connect.microsoft.com/VisualStudio/feedback/details/288349/datetimeoffset-is-not-serialized-by-a-xmlserializer

我建议你将DateTime序列化为long(这是实现在内部用于存储实际值的内容)。

您可以使用DateTime.Ticks来获取值,它有一个构造函数,需要很长的( Int64 )。

大卫

属性的数据类型(creationTimeX)是字符串,而XmlSerialization数据类型是“dateTime”。 这就是为什么你得到这个例外。

您可以通过将数据类型更改为DateTime来解决此问题

同样,对于您发布任何时区的当前时间,您必须应用DateTime.Now.ToUniveralTime并在其上应用适当的DateTimeFormat模式。

这些步骤就在这里

http://msdn.microsoft.com/en-us/library/k494fzbf.aspx

谢谢-RVZ