3

将对象存储在字符串中时,我可以确保将其转换回成功执行它是否依赖于其他东西?

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

这个问题询问以下对象类型:

  • 时间跨度
  • 约会时间
  • 整数
  • 漂浮
  • 双倍的

我试过阅读几个论坛,并没有看到相互矛盾的例子。我的代码也没有任何异常,但我确信我没有尝试所有可能的输入/场景。

4

3 回答 3

2

使用时,ToString您可以指定数字和时间的格式(有关更多信息,请参阅本主题)。

在许多这些情况下,您希望使用的格式是往返格式(“R”表示 Single、Double 和 BigInteger 类型,“O”表示 DateTime。)这种格式确保所有信息都传递给字符串,并且可以被解析回完全相同的数据。

传递IFormatProvidertoToString对于避免语言环境问题也很重要(例如,不同的语言环境可以使用不同的字符作为小数分隔符。)使用静态CultureInfo.InvariantCulture解决了这个问题。

最后,如果您尝试保存数据然后检索它,您可能需要考虑使用序列化程序,它接收整个类并将它们写入各种格式。.NET 有几个序列化程序,其中最突出的两个是BinaryFormatter(二进制)和DataContractSerializer(XML)。

于 2013-09-22T08:52:59.050 回答
1

Parse 和 ToString 是否能够转换为您选择的类型取决于它们的实现。默认情况下,转换将无需任何更改即可工作。

请注意 DateTime,因为您可能希望指定使用 ToString 输出时区信息,以便您的解析将使用正确的时区信息创建新的 DateTime。

于 2013-09-22T08:32:30.887 回答
1

您需要注意,在使用ToString这些类型的默认实现时,文化特定设置会发挥作用。

如果您总是在进行序列化的同一台机器上反序列化,这应该不是问题(除非用户可以在序列化和反序列化之间更改他们的文化设置)。

如果您打算在不同的机器上反序列化,您应该尝试使用文化不变表示。所有这些类型都有ToString采用格式说明符的重载。不幸的是,文化不变说明符都略有不同。对于数字类型,它是“r”(“往返”格式)。对于DateTime,它是“o”。因为TimeSpan它是“c”。通常,这些Parse方法接受当前区域性格式或不变格式。注意ParseExact方法。

于 2013-09-22T08:52:04.160 回答