Java中对象与字符串之间的转换的公认实践?

Java中对象与字符串之间的转换的公认实践?,java,string,object,type-conversion,Java,String,Object,Type Conversion,假设对象的确切类别已知,将任意对象转换为字符串表示形式或从字符串表示形式转换为字符串表示形式的常用方法是什么?换句话说,我需要实现一些类似于以下的方法: public interface Converter { /** * Convert this object to its String representation. */ public String asString(Object obj); /** * Take the Strin

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

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(新整数(5))应该返回“5”,converter.asObject(“5”,Integer.class)应该返回一个值为5的整数
  • 尽可能生成可读的输出
  • 处理所有常见的Java数据类型,包括Java.util.Date
  • 允许我为自己的自定义类插入转换功能
  • 重量轻,效率高
我知道有很多现成的解决方案可以做到这一点(比如谷歌的协议缓冲区),我自己也可以轻松实现一个一次性的解决方案。我的问题不是“我如何解决这个问题”,而是“在众多现成的解决方案中,哪一个是当前的行业标准?”

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

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

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


下一个与标准最接近的是日常使用的JSON-to-Java,但是,好吧,你知道,它不是Java-Java,我同意Oscar的观点,XML可能是更可取的形式,如果你能容忍较大的未压缩文件大小的话。为了详细说明他的答案,根据我的经验,如果您编写一个相当简单的实用程序类,您可以将对象序列化为XML,而无需做太多工作。为了重新阅读,我推荐ApacheDigester,它在基于规则的解释方面做得很好


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

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


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

尽管使用或尝试实现“toString()”作为可逆操作很有诱惑力,但“toString()”的目的是生成用户友好且易于理解的对象表示,这一目标通常与包含足够的状态信息以真正还原原始对象不符


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

我也会投票支持Json,尤其是Json。它可以很好地处理通用/参数化对象

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

public Object asObject(String stringRepresentation, Class clazz);
例如

public <T extends Object> T asObject(String stringRepresentation, Class<T> clazz);
publictasobject(字符串表示,类clazz);
这样就不需要在事后施展了