代码之家  ›  专栏  ›  技术社区  ›  Bugmaster

在Java中将对象转换成字符串的接受实践?

  •  4
  • Bugmaster  · 技术社区  · 15 年前

    假设已知对象的确切类,那么将任意对象转换为字符串表示形式或从字符串表示形式转换为字符串表示形式的常见方法是什么?换句话说,我需要实现一些类似于以下的方法:

    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的整数。
    • 尽可能生成人类可读的输出。
    • 处理所有常见的Java数据类型,包括JavaUTL.DATE。
    • 允许我为自己的自定义类插入转换功能。
    • 重量轻,效率高。

    我知道有很多现成的解决方案可以做到这一点(例如谷歌的协议缓冲区),我自己也可以很容易地实现一次性解决方案。我的问题不是“我如何解决这个问题”,而是“许多现成的解决方案中,哪一个是当前的行业标准?”.

    5 回复  |  直到 12 年前
        1
  •  2
  •   mikera    12 年前

    我也会投JSON的票,特别是 Gson . 它可以很好地处理一般/参数化对象。

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

    public Object asObject(String stringRepresentation, Class clazz);
    

    例如

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

    这样就不需要在事后进行铸造了。

        2
  •  3
  •   OscarRyz    15 年前

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

    它们中没有一个已经成为诽谤标准。

    你能得到的最接近的“默认” XML serialization mechanism 如果你假装是用手写的,那就太糟糕了(而且当你自动使用的时候就足够了)

    下一个与标准最接近的是日常使用的是JSON-Java,但是,你知道,它不是Java Java。

        3
  •  2
  •   Nathan Feger    15 年前

    您可以查看SvsSon库,它将Java对象转换为JSON。它非常快速,使用注释引入自定义转换器。

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

    不久前,我本可以提出一个XML序列化程序,但在与 couchdb 几天来,我为一个新主人服务…杰森。

        4
  •  2
  •   Michael Aaron Safyan    15 年前

    虽然使用或尝试将“toString()”实现为可逆操作是很有吸引力的,但“toString()”的目的是生成一个用户友好且易于理解的对象表示,并且此目标通常与包含足够的状态信息以真正还原原始对象相冲突。

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

        5
  •  0
  •   Uri    15 年前

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

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