2013-09-22 73 views
3

將對象存儲在字符串中時,我可以確保將其轉換回來將成功執行嗎?是否取決於其他內容?從基本系統類型轉換爲字符串可逆嗎?

DateTime dt = DateTime.UtcNow; 
string pattern = dt.ToString(); 
DateTime retDt = DateTime.Parse(pattern); 

這個問題是問以下對象類型:

  • 時間跨度
  • 日期時間
  • INT
  • 長期
  • 浮動

我曾嘗試閱讀幾個論壇,並沒有看到矛盾的例子。我也沒有 從我的代碼中得到了任何異常,但我確定我沒有嘗試過所有可能的輸入/場景。

+0

你試圖解決什麼具體問題? –

+0

@SpencerRuport - 我僅限於將這些對象類型存儲爲兩個字符串變量 - 模式和格式。我需要將它們轉換回來的能力。 –

+0

@Yosi它依賴於**結構**(包含多少信息?),重寫的ToString()和解析器Parse。對DateTime和TimeSpan來說很難說,但我們只需要深入研究它們的結構就可以得到答案。 –

回答

2

使用ToString時,您可以指定數字和時間的格式(有關更多信息,請參閱this topic)。

你想在許多情況下使用的格式是往返格式(「R」的單人,雙人和BigInteger的類型,「O」的日期時間。)這種格式可以確保所有的信息通過到字符串,並可以解析回到完全相同的數據。

傳遞一個IFormatProviderToString也是必不可少的,以避免與語言環境的問題(例如,不同的語言環境可以使用小數分隔不同的字符。)使用靜態CultureInfo.InvariantCulture解決了這個問題。

最後,如果你想堅持的數據,然後檢索它,你可能要考慮使用串行,這需要整個並將其寫入到各種格式。 。NET有幾個序列化器,其中兩個最突出的是BinaryFormatter(二進制)和DataContractSerializer(XML)。

1

解析和ToString能夠轉換爲您選擇的類型和來自您選擇的類型取決於它們的實現。默認情況下,轉換將不會發生任何變化。

請注意DateTime,因爲您可能希望指定使用ToString輸出時區信息,以便您的分析將使用正確的時區信息創建新的DateTime。

1

您需要知道,對這些類型使用默認ToString實現時,文化特定設置將發揮作用。

如果你總是反序列化在序列化的同一臺機器上,它不應該是一個問題(除非用戶可以在序列化和反序列化之間更改他們的文化設置)。

如果您打算在另一臺機器上反序列化,您應該嘗試使用文化不變表示法。所有這些類型都有ToString的重載,它們採用格式說明符。不幸的是,文化不變說明符都略有不同。對於數字類型,它是「r」(「往返」格式)。對於DateTime,它是「o」。對於TimeSpan它是「c」。通常,Parse方法接受當前文化格式或不變格式。小心ParseExact方法。

相關問題