2013-02-22 52 views
4

一個的DateTimeOffset設置時,當我保存在我的項目設置的DateTimeOffest失去精度,我失去了一些精度: Losing precision on DateTimeOffset serialization節省項目設置

第一個變量是原始值,系列化之前。 第二個是反序列化後的值。

其實我的變量序列化這樣的配置文件:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <userSettings> 
     <MyApp.Properties.Settings> 
      [...] 
      <setting name="LatestCheckTimestamp" serializeAs="String"> 
       <value>02/22/2013 14:39:06 +00:00</value> 
      </setting> 
      [...] 
     </MyApp.Properties.Settings> 
    </userSettings> 
</configuration> 

有沒有指定某些系列化參數來提高精度的方法嗎?

我知道我可以使用一些解決方法,例如通過存儲Ticks和偏移值或類似的東西,但我想知道是否沒有更好的方法。

編輯: 更多信息:我使用的是標準的Visual Studio項目設置存儲我的價值:

MyApp.Settings.Default.LatestCheckTimestamp = initialLatestCheckTimestamp; 
MyApp.Settings.Default.Save(); 

MyApp.Settings是當你在項目屬性編輯設置由Visual Studio生成的類頁。

編輯2:解決方案

基礎上馬特·約翰遜的答案,這是我做過什麼:

  1. 改名從LatestCheckTimestamp設置以LatestCheckTimestampString沒有在我的代碼
  2. 在獨立文件中添加以下包裝以完成部分類Settings

public DateTimeOffset LatestCheckTimestamp 
{ 
    get { return DateTimeOffset.Parse(LatestCheckTimestampString); } 
    set { LatestCheckTimestampString = value.ToString("o"); } 
} 

新的配置文件如下:

<configuration> 
    <userSettings> 
     <MyApp.Properties.Settings> 
      [...] 
      <setting name="LatestCheckTimestampString" serializeAs="String"> 
       <value>2013-02-22T16:54:04.3647473+00:00</value> 
      </setting> 
     </MyApp.Properties.Settings> 
    </userSettings> 
</configuration> 

...和我的代碼仍然是

MyApp.Settings.Default.LatestCheckTimestamp = initialLatestCheckTimestamp; 
MyApp.Settings.Default.Save(); 
+0

您打算支持多個Windows用戶嗎?如果是這樣,每個人都有自己的「上次檢查時間」,或在他們之間共享? ApplicationSettingsBase(Settings類的派生類)存在的問題之一是它不允許寫入應用程序作用域設置(儘管有解決方法)。 – jerry 2013-02-22 18:40:35

+0

@jerry我的設置是用戶範圍。沒有問題。感謝您的詢問。 – JYL 2013-02-22 21:27:17

回答

2

最可靠的方法序列化DateTimeOffsetRoundTrip pattern,這是使用"o"標準序列化字符串指定的。

這使用ISO8601標準,它與其他系統,語言,框架等高度互操作。您的值看起來像這樣:2013-02-22T14:39:06.0000000+00:00

.Net將以這種格式存儲小數秒至7位小數。

如果你可以顯示你如何存儲和檢索你的應用程序設置的一些代碼,我可以告訴你在哪裏指定格式字符串。在大多數情況下,它只是.ToString("o")

+0

根據你的回答,我爲以字符串而不是DateTimeOffset存儲的值作了包裝。看我的編輯。謝謝 ! – JYL 2013-02-22 17:15:58

+1

這似乎是合理的。我挖了一點MSDN文檔,並沒有顯示你可以指定應用程序設置的格式字符串。他們爲此使用默認格式很瘋狂,特別是因爲它對文化敏感。 ''o「'格式更安全。 – 2013-02-22 18:19:30