`

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

阅读更多

原文:http://www.infoq.com/cn/news/2010/09/joda_convert

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

分享到:
评论

相关推荐

    JAVA白皮书(英文版)

    - **字符串**:讲解字符串的操作方法及其在Java中的重要性。 - **多级break**:解释了多级break语句的作用和使用场景。 - **内存管理和垃圾回收**:深入探讨了Java中自动内存管理和垃圾回收机制的工作原理。 - **...

    Java宝典(第四版)

    ### Java宝典(第四版):关键知识点综述 #### 一、JVM与Java内存管理 ##### 1.1 JVM **Java内存模型(JMM)**:JMM定义了程序中各种变量(线程共享变量)的访问规则,以及在并发环境下变量的存储与读取假设。它是...

    Android系统的开发综述

    - **资源管理器(Resource Manager)**:提供对非代码资源的访问,如本地化字符串、图形、布局文件等。 - **通知管理器(Notification Manager)**:用于在状态栏中显示自定义的通知信息。 - **活动管理器...

    Java项目开发平台开发规范.doc

    Java项目开发平台开发规范文档...- 字符转换:在处理多语言或多字节字符集时,了解如何正确地编码和解码字符串至关重要。 理解并遵循这些规范和指南,将有助于开发者在BONC-JONE平台上高效、稳定地进行Java项目开发。

    vc++6.0 程序设计学与用教程

    本书全面介绍了Java语言的特点和功能,主要包括Java编程基础知识、Java算术运算符、Java编程语法、面向对象程序设计基本概念、系统类的使用和应用、图形用户界面设计、图形处理、多媒体处理、异常处理、多线程、网络...

    java面试问题汇总(非常全面)

    - `String`:不可变字符串,每次修改都会创建新对象。 - `StringBuffer`:可变字符串,线程安全。 - `StringBuilder`:非线程安全版本的 `StringBuffer`,性能更高。 #### 23. Spring如何工作? Spring 框架通过...

    Ice_1.3.0中文文档

    - Slice支持各种内置数据类型,如整型、浮点型、字符串等。 #### 4.7 用户定义的类型 - 用户可以根据需求定义自己的数据类型,如枚举、结构体、序列等。 #### 4.8 接口、操作及异常 - **接口**: Slice允许定义抽象...

    GBase 8s 开发手册.pdf

    - **URL 语法、配置属性**: 解释了如何通过 JDBC URL 来配置连接字符串,以及可以设置的各种连接属性。 - **API 实现要点**: 提供了一些关于如何使用 GBase JDBC API 的重要提示和建议。 ##### 3. Java、JDBC 和 ...

    ICE 中文文档(不含ICEGrid)

    Slice 语言支持多种基本类型,如整数、字符串等,用于构建更复杂的对象定义。 #### 4.7 用户定义的类型 除了基本类型外,Slice 还允许用户定义自己的类型,例如结构体、枚举等。 #### 4.8 接口、操作,以及异常 ...

    论文研究-一种web文本预处理方法 .pdf

    在预处理中,针对XML格式的网页文本解析尤为关键,XML文档具有良好的结构性,可以使用XML解析方法将其序列化字符串格式转换为分层格式。解析过程涉及到多种技术,包括DOM、SAX、JDOM和Dom4j等。DOM解析器能够以树状...

    ASP.NET完全入门

    在ASP.NET中,创建Web应用程序需要配置Web.config文件,该文件包含了应用程序的设置和依赖项,如连接字符串、命名空间引用等。 **4.2 应用程序框架** ASP.NET提供了一系列内置对象和服务,如Request、Response、...

Global site tag (gtag.js) - Google Analytics