写点什么

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

  • 2010-09-19
  • 本文字数:1562 字

    阅读完需:约 5 分钟

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 Struts Apache 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

2010-09-19 09:094752
用户头像

发布了 127 篇内容, 共 49.1 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

Ansible 配置

耳东@Erdong

4月日更

专访吴翰清 || 如何用网络安全保障个人隐私

Bob

网络安全 个人隐私 调查采访能力考核

Zookeeper基础原理&应用场景详解

leonsh

zookeeper 中间件 ZooKeeper原理

存储成本降低80%!US3在海量数据归档存储下的成本优化技术实践

UCloud技术

存储 海量数据 存储成本

不忘初心,砥砺前行|暨InfoQ写作平台一周年

程序员架构进阶

28天写作 4月日更 1 周年盛典 我和写作平台的故事 InfoQ 写作平台 1 周年

禁止算法识别性别,能消解歧视吗?

脑极体

分库分表笔记

luojiahu

分库分表

没有自信的人,才会在意别人的评价

小天同学

心理 日常思考 个人感悟 4月日更 自信

白皮书:区块链将成隐私计算产品必选项,提供三方面助力

CECBC

区块链

Semaphore自白:限流器用我就对了!

王磊

Java 多线程 Semaphore

哭了!“日志注入”为什么跟想象中的不一样

华为云开发者联盟

Java 参数 日志注入 log4j2框架 异常堆栈

使用 SpringBoot 的 CommandLineRunner 遇到的坑

Java小咖秀

容器 开发 springboot CommandLineRunner ApplicationRunner

【LeetCode】解码方法Java题解

Albert

算法 LeetCode 4月日更

实体经济与数字经济加速融合 中国经济新动能快速成长

CECBC

数字经济

专访声网首席资深iOS研发工程师龚宇华:从自学计算机到高级架构师

程序员潘Sir

专访

浅谈Javascript中的forEach和map之间的区别

devpoint

遍历 foreach map reduce

架构实战营 模块2作业

CR

区块链电子证据的司法应用现状与展望

CECBC

NumPy之:NumPy简介教程

程序那些事

Python 数据分析 Python3 Numpy 程序那些事

《专访彩食鲜CTO乔新亮:体系的重要性》(采访提纲)

花花

调查采访能力考核

Golang 并发

escray

学习 极客时间 Go 语言 4月日更

炫彩无界,性能怪兽,M1 扛鼎未来 —— 2021 年 Apple 春季新品发布会全记录

清秋

产品 苹果 硬件 新闻

应用区块链技术打通各自为战形成的壁垒

CECBC

“湘”遇区块链 赋能新业态

CECBC

读《乌克兰拖拉机简史》有感

箭上有毒

读书笔记 4月日更

【Knative系列】看完这篇还不懂 Knative Serving,你来打我~(史上最详细)

公众号:云原生Serverless

Serverless 云原生 Knative

网络安全传奇吴翰清采访提纲 |调查采访能力考核

清秋

网络安全 签约计划 调查采访能力考核

聪明人的训练(二十一)

Changing Lin

4月日更

张超 - 机锋网联合创始人 - 采访提纲:那些 3 个月就上线的产品,如何去做技术规划?

梦想橡皮擦

签约计划

为什么 Serverless 将推动边缘计算的革命

公众号:云原生Serverless

Serverless 边缘计算

ES 终于可以搜到“悟空哥”了!

悟空聊架构

中文分词 elasticsearch 分词 ES ik

综述:字符串到Java对象转换的工具库_Java_Tim Cull_InfoQ精选文章