2008-11-21 218 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); } 
} 
相關問題