當透過 DataContractJsonSerializer 將 Json字串 與 物件做序列化與反序列化時,發現了DateTime型別的[DataMember]會出現執行例外的問題,而這個問題的發生是因為DateTime預設值所發生的:
在上圖是所宣告Object中的DataMember,其中宣告了兩個DateTime屬性,分別是CreatedTiem與ReturnTime,但是當在新增物件時,卻因為RetrunTime是於另外一個狀態下才會使用的屬性,因此所測試中所模擬的值是如下:
如上圖所示,只有CreateTime被賦予值,但是RetrunTime就不做任何設定,但執行測試時就發生了錯誤,這個錯誤不是因為測試結果與預期不相同,而是因為跳出例外
這個例外的詳細內容如下:
其實這個問題就是發生在ReturnTime當沒有被賦予值時,在序列化的過程中DateTime欄位會被賦予一個預設值是0001/01/01 AM 12:00:00 的時間,這個時間就是DateTime.MinValue,但是如果在仔細看上圖的說明,會發現[或小於DateTime.MinValue]字樣,既然預設值是DateTime.MinValue就不會有小於的問題,因為這個預設值是等於DateTime.MinValue,解決方法有兩個:
方法一、
將沒有用到的日期一樣賦予預設值,但是這個預設值只要設定為DateTime.MinValue.AddDays(1)
記得一定要AddDays(1)以上,只要小於AddDays(1)的都會有同樣的例外會發生。
方法二、
將Object中宣告的[DataMember]中將DateTime型別加入 ? ,這樣如果像一開始所設定的一樣,不設定ReturnTime,則這個RutuenTime就會預設宣告為null。
參考資料
留言