将任意对象转换为String表示形式的常用方法是什么,假设该对象的确切类已知?换句话说,我需要实现一些类似于以下的方法:
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);
}
理想情况下,解决方案应该:
我知道有很多现成的解决方案可以做到这一点(例如Google的协议缓冲区),而且我可以自己轻松实现一次性解决方案。我的问题不是“我该如何解决这个问题”,而是“现有的许多现成解决方案中哪一个是当前的行业标准?”。
答案 0 :(得分:3)
我的问题不是“我该如何解决这个问题”,而是“许多现成的解决方案中哪一个是当前的行业标准?”。
它们都没有成为事实上的标准。
最接近你可以得到它“默认”XML serialization mechanism如果你假装用手写它们,BTW很糟糕(当你自动使用它们就足够了)
接下来最接近标准并将用于日常使用的东西是JSON到Java,但是,你知道,它不是Java Java
答案 1 :(得分:2)
您可以查看svenson库,它将java对象转换为json。它非常快,并使用注释来引入自定义转换器。
http://code.google.com/p/svenson/
不久前我会提出一个xml序列化程序,但是在玩couchdb几天之后,我会为一个新的主人服务... json。
答案 2 :(得分:2)
虽然使用或尝试实现“toString()”作为可逆操作很诱人,但“toString()”的目的是生成一个用户友好且易于理解的对象表示,这个目标是经常与包含足够的状态信息以真正恢复原始对象相矛盾。
如果您希望持久化对象,使用XML,JSON或二进制序列化可能是最好的方法。 “toString()”函数应报告对象的人性化表示(例如“5”,“(3,0,2)”,“5 + 6i”,“{1,2,3,4,5] ,6“”,“{x => y,z => 3}”等。即使在可以从生成的字符串中完全恢复对象的情况下,编写函数来解析每种类型(可能是非结构化的)文本的时间最好通过自动XML持久性来保存,这有利于编写实际应用程序的时间。
答案 3 :(得分:2)
我也会投票支持Json,然后特别是Gson。它很好地处理通用/参数化对象。
或者,您也可以编写一个通用对象转换器,它可以在一点反射的帮助下完成所有需要的转换,例如this example。但是,如果您的“API”要求将此转换器作为最终用户的接口发布,那么我只建议替换
public Object asObject(String stringRepresentation, Class clazz);
例如
public <T extends Object> T asObject(String stringRepresentation, Class<T> clazz);
以便之后不需要施放它。
答案 4 :(得分:0)
我同意Oscar的观点,如果你可以容忍大的未压缩文件大小,那么XML可能是更好的形式。为了详细说明他的答案,根据我的经验,如果你编写一个相当简单的实用程序类,你可以将对象序列化为XML而不需要太多工作。要阅读它们,我会推荐Apache Digester,它可以很好地完成基于规则的解释。
如果我关心性能或文件大小,我只会选择其他文件格式,尽管在大多数情况下我更喜欢XML的灵活性。