跳到主要內容

DataContractJsonSerializer DataTime 例外錯誤

當透過 DataContractJsonSerializer 將 Json字串 與 物件做序列化與反序列化時,發現了DateTime型別的[DataMember]會出現執行例外的問題,而這個問題的發生是因為DateTime預設值所發生的:

 

image

在上圖是所宣告Object中的DataMember,其中宣告了兩個DateTime屬性,分別是CreatedTiem與ReturnTime,但是當在新增物件時,卻因為RetrunTime是於另外一個狀態下才會使用的屬性,因此所測試中所模擬的值是如下:

image

如上圖所示,只有CreateTime被賦予值,但是RetrunTime就不做任何設定,但執行測試時就發生了錯誤,這個錯誤不是因為測試結果與預期不相同,而是因為跳出例外

image

這個例外的詳細內容如下:

image

其實這個問題就是發生在ReturnTime當沒有被賦予值時,在序列化的過程中DateTime欄位會被賦予一個預設值是0001/01/01 AM 12:00:00 的時間,這個時間就是DateTime.MinValue,但是如果在仔細看上圖的說明,會發現[或小於DateTime.MinValue]字樣,既然預設值是DateTime.MinValue就不會有小於的問題,因為這個預設值是等於DateTime.MinValue,解決方法有兩個:

方法一、

將沒有用到的日期一樣賦予預設值,但是這個預設值只要設定為DateTime.MinValue.AddDays(1)

image

記得一定要AddDays(1)以上,只要小於AddDays(1)的都會有同樣的例外會發生

方法二、

將Object中宣告的[DataMember]中將DateTime型別加入 ? ,這樣如果像一開始所設定的一樣,不設定ReturnTime,則這個RutuenTime就會預設宣告為null。

image

 

參考資料

原始Windows Pass Json to Asp.net範例

留言

這個網誌中的熱門文章

以管理者權限執行批次檔

最近有個專案需要執行批次檔,來進行某些設定或者城市的安裝,在XP上這個Script可以運行沒問題,可是一到Vista以後的Windows版本就無法運行了,最主要的原因是,UAC的管制的問題,幾經尋找,總算找到一個可行的解決辦法。

如何使用電子發票應用API

財政部在電子發票推行上,為了方便開發更多應用所以提供了API可供個人或者廠商進行相關應用的開發,申請的方式請參考 –> 電子發票API申請 最簡單的申請方式就是透過自然人憑證或者工商憑證申請,這樣就不需要檢附任何證明文件。不過這不是本篇的重點,當申請到時會給你一組AppID跟APIKey,然後你可以下載 電子發票應用規格1.4版 來了解怎樣使用這個API,或許是我才疏學淺,所以在1.3版的時候其實搞不太懂他的API文件,到了1.4版才摸清楚發生了什麼事,當然還是花了點時間才搞懂,現在就簡單說明一下API的使用方式,希望看到本篇文章的同好就不需要花時間測試了。

DataGridView欄位統一格式化

最近的工作內有一個需求,就是由於專案中有許多呈現資料的DataGridView,而其中的欄位需要呈現的包含金額、數字或者日期等格式,若要一個個的設定格式,如果有一天格式突然變更,可能就要苦工做到死,如何讓專案中的這些格式都統一就成了一個問題,經過了一番查找,發現可以透過DataGridView.CellFormatting Event來解決這個問題。