2008-11-21 227 views
4

正在为任何时区获取DateTimes。 我正在使用DateTimeOffset,以及一个字符串和一个XmlElement属性。当我这样做,我得到以下错误:如何序列化为日期时间

[InvalidOperationException: 'dateTime' is an invalid value for the XmlElementAttribute.DataType property. dateTime cannot be converted to 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: There was an error reflecting type '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 accessor, FieldModel model, 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: There was an error reflecting property '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; 
    } 
} 
+0

只为记录。当心`DateTimeOffset`。使用WCF序列化时,有一些序列化DateTimeOffset的问题。 – 2012-02-21 16:51:11

回答

2

在这个问题的StackOverflow看看有关串行日期和UTC:

Best practices for DateTime serialization in .Net framework 3.5/SQL Server 2008

无需要创建一个特殊的属性来完成序列化灰。

+0

的评论说,这一切..甚至认为ISO时间允许,什么... 如果你绝对,积极必须知道时区本身(即以上可能是东部标准时间或中央夏令时),您需要创建自己的数据类型来暴露这些片段。 实现iXmlSerializer – 2008-11-21 17:21:14

+0

UTC是旧的方式(确定序列化),但不回答关于序列化DateTimeOffset(与时区相关)的问题。阅读有关此主题的MSDN文章,Microsoft的当前建议是用于处理/存储的DateTimeOffset和用于在涉及时区的任何位置进行计算的TimeZoneInfo: http://msdn.microsoft.com/en-us/library/bb384267(v=vs .110).aspx 只有选项使用不同的序列化程序(DataContract或NetDataContract),添加属性(如我添加到MS连接文章的解决方法),或者使用UTC和时区标识创建自己的结构,但标准不太标准 – 2014-04-15 12:10:12

0

大卫

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

您可以通过更改数据类型为DateTime

也为您的当前时间,以任何时区问题解决这个问题,你就必须申请一个 DateTime.Now.ToUniveralTime并在其上应用适当的DateTimeFormat模式。

这些步骤在这里

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

感谢 -RVZ

+0

不是我所需要的。 我想重写标准的DateTime,以便我们可以指定任何时间zome ....例如DateTimeOffset。 Specifing数据类型为字符串工程positiveInteger,nonPositiveInteger等等......但对于日期时间不工作 感谢 – 2008-11-21 15:56:44

1

我建议你将DateTime序列化为一个long(这是实现内部用来存储实际值的东西)。

您可以使用DateTime.Ticks来获取该值,并且其构造函数需要很长时间(Int64)。

2

这对我来说

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); } 
} 
相关问题