【问题标题】:Accepted practice for converting an Object to and from a String in Java?在 Java 中将对象转换为字符串和从字符串转换为可接受的做法?
【发布时间】:2010-12-13 07:02:43
【问题描述】:

假设对象的确切类是已知的,那么将任意对象转换为字符串表示和从字符串表示转换为普遍接受的方法是什么?也就是说,我需要实现一些类似下面的方法:

public interface Converter {

    /**
     * Convert this object to its String representation.
     */
    public String asString(Object obj);

    /**
     * Take the String representation of an object produced by asString, 
     * and convert it back to an object of the appropriate class.
     */
    public Object asObject(String stringRepresentation, Class clazz);
}

理想情况下,解决方案应该:

  • 如果可能,请使用对象的内置 toString() 功能。因此,converter.asString(new Integer(5)) 应该返回 "5",converter.asObject("5", Integer.class) 应该返回一个值为 5 的 Integer。
  • 尽可能生成人类可读的输出。
  • 处理所有常见的 Java 数据类型,包括 java.util.Date 。
  • 允许我为自己的自定义类插入转换功能。
  • 相当轻量级和高效。

我知道有许多现成的解决方案可以做到这一点(例如 Google 的协议缓冲区),而且我自己可以轻松实现一次性解决方案。我的问题不是“我该如何解决这个问题”,而是“在众多现成的解决方案中,哪一个是当前的行业标准?”。

【问题讨论】:

    标签: java string object type-conversion


    【解决方案1】:

    我的问题不是“我该如何解决这个问题”,而是“在众多现成的解决方案中,哪一个是当前的行业标准?”。

    它们都没有成为事实上的标准。

    你可以得到最接近的“默认”XML serialization mechanism,如果你假装手写它们,顺便说一句很糟糕(当你自动使用它们时就足够了)

    下一个最接近标准并且用于日常使用的东西是 JSON 到 Java,但是,你知道,它不是 Java Java

    【讨论】:

      【解决方案2】:

      我同意 Oscar 的观点,如果您可以容忍较大的未压缩文件大小,XML 可能是这里的首选格式。为了详细说明他的答案,根据我的经验,如果您编写一个相当简单的实用程序类,您可以将您的对象序列化为 XML,而无需太多工作。要阅读它们,我会推荐 Apache Digester,它在基于规则的解释方面做得很好。

      如果我关心性能或文件大小,我只会选择其他文件格式,尽管我通常在大多数情况下更喜欢 XML 的灵活性。

      【讨论】:

        【解决方案3】:

        您可以查看 svenson 库,它将 java 对象转换为 json。它非常快,并且使用注释来引入自定义转换器。

        http://code.google.com/p/svenson/

        不久前我会提出一个xml序列化器,但是在玩了几天couchdb之后,我服务了一个新的主人...... json。

        【讨论】:

          【解决方案4】:

          虽然使用或尝试实现“toString()”作为可逆操作是很诱人的,但“toString()”的目的是生成一个用户友好且易于理解的对象表示,而这个目标是通常与包含足够的状态信息以真正恢复原始对象不一致。

          如果您希望持久化一个对象,使用 XML、JSON 或二进制序列化可能是最好的方法。 “toString()”函数应该报告对象的人类友好表示(例如“5”、“(3,0,2)”、“5+6i”、“{1, 2, 3, 4, 5 , 6}”、“{x => y, z => 3}”等)。即使在可以从生成的字符串中完全恢复对象的情况下,通过自动 XML 持久性最好节省编写函数来解析每种类型(可能是非结构化)文本的时间,以节省编写实际应用程序的时间。

          【讨论】:

            【解决方案5】:

            我也会投票给 Json,然后特别是 Gson。它可以很好地处理通用/参数化对象。

            或者,您也可以编写一个通用对象转换器,它在反射的帮助下完成所有需要的转换,例如this example。但是,如果您的“API”要求将此转换器作为最终用户的接口发布,那么我只建议替换

            public Object asObject(String stringRepresentation, Class clazz);
            

            例如

            public <T extends Object> T asObject(String stringRepresentation, Class<T> clazz);
            

            这样以后就不需要再施法了。

            【讨论】:

              猜你喜欢
              • 2016-04-06
              • 2011-08-30
              • 2015-01-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-10-25
              • 2014-07-18
              相关资源
              最近更新 更多