BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

综述:字符串到Java对象转换的工具库

| 作者 Tim Cull 关注 0 他的粉丝 ,译者 张凯峰 关注 1 他的粉丝 发布于 2010年9月20日. 估计阅读时间: 5 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

Joda Time fame的Stephen Colebourne关于他之前发布的一个Java库Joda Convert 在他的blog上率先发起了一场小范围的争论这个库可以通过annotation来进行基础对象和字符串之间的转换。为了解释清楚关于字符串转换的方方面面,下面是对字符串和对象间互相转换技术的一个综述,让我们从Joda Convert开始。

根据Colebourne先生的文章,Joda Convert宣称的目标是为了简单性而牺牲完整性。它允许Java类的作者指定任意名称的方法,实现从字符串到此类实例间的转换。比 如,Currency类可能有个静态方法叫做“fromISOCode(code)”,以及一个实例方法“getISOCode()”。如果为这两个方法 添加来自Joda Convert的annotation:@FromString和@ToString,使用Currency类的应用就可以通过类似这样的调用:“Foo bar = StringConvert.INSTANCE.convertFromString(Foo.class, str);”,来实现对象和字符串间的转换。这样的转换通常对那些必须解析来自HTTP GET数据的Web应用很有帮助。Colebourne先生的这篇blog的评论者们则提出了一些其他的可替代方案。

第一个可替代方案是Java中内嵌的java.beans.PropertyEditor。PropertyEditor使用JavaBeans技术来把字符串转换成属性值。虽然PropertyEditor一般常见于像IDE这样的可视化编辑器里面,但其实它也可以用在后台的处理上。比如Spring3.0之前的版本广 泛地使用了PropertyEditor来支持数据绑定和验证。不像Joda Convert,PropertyEditor可以用在很多方面,而不仅仅是把字符串转换成对象。比如,PropertyEditor有内建的对注册 PropertyChangeListener的支持。

J2EE在JSF中也有自己内建的转换技术。JSF中包含了用于普通类型比如BigDecimal、Float、DateTime等的转换器,也提供了一个接口用于自定义转换器实现。自定义实现只需要为getAsObject和getAsString方法提供代码。但是JSF转换器和JSF绑定得很紧,所以在JSF以外使用它们会很困难。还有一些其他第三方的替代方案实现了字符串转换技术。其中一个最近被用在Spring 3.0中。虽然Spring之前的版本使用PropertyEditor,但SpringSource选择在3.0里面实现自己的转换方法。根据SpringSource所说:

当我们开始改善Spring 3的数据绑定系统时,我们的目标是:
1. 提供一个无状态、强类型的类型转换SPI来取代JavaBean PropertyEditor
2. 提供一个统一的类型转换API,用在任何需要的地方,包括Spring的DataBinder和Expression Language
3. 可以通过Java注解元数据来驱动类型转换
4. 通过注册可感知的缺省设置,以及采用惯例优于配置的策略,来简化转换

SpringSource并不是唯一一家提供自己的类型转换器的开源组织。一些Apache项目也有他们自己的类型转换器,比如Apache Commons BeanUtils(用在Apache Digester),陷入停滞的Apache Commons Convert,甚至是Apache StrutsApache Camel

一些框架还被设计成不仅仅能把字符串转换成对象。比如,Dozer是一个可以把任意复杂的对象转换成其他任意复杂的对象。因为字符串就是对象,所以它可以处在Dozer转换的任意一方。

最后,在选择一种转换技术的时候,开发者需要记住的是,上面提到的任何一种技术都是针对自己的目标环境而优化的。比如,浏览器中发送到HTML表单以及接收 自HTML表单的字符串,就会和把同一个对象写成XML文档的字符串不太一样。此外,即使是在完全相同的目标环境,比如浏览器中,一些用户可能需要的是不 同的本地化字符串(比如日期“2010-31-01”或者“1/31/2010”)。最后但一样重要的是,不同的媒介会支持不同的字符串编码。比如,XML文档可以使用UTF-8、ISO-8859-1或者许多其他的编码,因为它可以在第一行中指定字符串编码。而从URL解析得到的字符串只能是ASCII编码。

查看英文原文:Roundup of String to Java Object Conversion Libraries

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT