【问题标题】:Is conversion from basic system types to string reversible?从基本系统类型到字符串的转换是否可逆?
【发布时间】:2013-09-22 08:28:10
【问题描述】:

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

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

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

  • 时间跨度
  • 日期时间
  • int
  • 浮动

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

【问题讨论】:

  • 你想解决什么具体问题?
  • @SpencerRuport - 我仅限于将这些对象类型存储到两个字符串变量 - 模式和格式。我需要能够将它们转换回来。
  • @Yosi 它取决于 结构(它包含多少信息?)、被覆盖的 ToString() 和解析器 ParseDateTimeTimeSpan 很难说,但我们只需要深入研究它们的结构即可得到答案。
  • Yosi 如果您只需将所有这些类型存储为字符串,我认为更可靠的解决方案是将它们二进制序列化并将它们转换为 Base64 编码,以便您可以将它们存储为字符串。有什么不可行的原因吗?
  • @SpencerRuport - 这不会降低代码的可读性吗?只有在不安全的情况下,我才会将其作为一种选择。

标签: c# type-conversion


【解决方案1】:

使用ToString 时,您可以指定数字和时间的格式(请参阅this topic 了解更多信息)。

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-02
        • 2019-02-23
        • 1970-01-01
        • 1970-01-01
        • 2011-01-20
        • 2011-12-29
        相关资源
        最近更新 更多