发布在即!企业 AIGC 应用程度测评,3 步定制专属评估报告。抢首批测评权益>>> 了解详情
写点什么

综述:字符串到 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:094124
用户头像

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

关注

评论

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

针对 Kubernetes v1.22,阿里云容器服务 ACK 提供了哪些升级和增强能力?

阿里巴巴云原生

阿里云 容器 云原生 产品升级 ACK

Linux中buff-cache占用过高解决方案

入门小站

Linux

J2PaaS企业级低代码平台,如何支撑开发企业级应用?

J2PaaS低代码平台

低代码 低代码开发 企业级低代码平台 企业级应用

网络安全kali渗透学习 web渗透入门Metasploitable2靶机系统介绍

学神来啦

丰e足食将大量引入算法人才 加快无人零售算法研发和应用

江湖老铁

3月2日,阿里云开源 PolarDB 企业级架构将迎来重磅发布

阿里云数据库开源

数据库 阿里云 开源 分布式 polarDB

【web安全】你的open_basedir安全吗?

H

网络安全 WEB安全

外包学生管理系统架构设计

炎彬

「架构实战营」

16 张图解带你掌握一致性哈希算法

华为云开发者联盟

负载均衡 分布式系统 一致性哈希 哈希算法 数据迁移

学生管理系统架构设计

随欣所遇

架构实战营

Trisk:在 Flink 上实现以 task 为中心的流处理动态 Reconfiguration 的 Control Plane

Apache Flink

大数据 flink 开源 编程 实时计算

在线JWT Token解析解码

入门小站

工具

基于外包学生管理系统的架构文档

刘帅

架构实战营:模块八作业

Geek_93ffb0

「架构实战营」

Flink State - Backend Improvements and Evolution in 2021

Apache Flink

大数据 flink 开源 编程 实时计算

云原生小课堂 | Envoy请求流程源码解析(一):流量劫持

York

云原生 istio envoy

用实例带你深入理解Java内存模型

华为云开发者联盟

Java JVM JMM 线程安全 Java内存模型

通过5个函数带你理解K8s DeltaFIFO

华为云开发者联盟

k8s Queue Client-go DeltaFIFO FIFO

1月云短信报告出炉,华为云跃居榜首

博睿数据

如何合理使用 CPU 管理策略,提升容器性能?

阿里巴巴云原生

阿里云 容器 云原生 资源管理 ACK

中台和低代码,“零和”还是“竞合”?

WorkPlus

小熊派:用OpenHarmory3.0点亮LED

华为云开发者联盟

小熊派 OpenHarmony 驱动开发 小熊派Micro LED

前后端分离项目,如何解决跨域问题?

CRMEB

详解近端策略优化

行者AI

深度强化学习

Flink 实践教程-进阶(8):自定义标量函数(UDF)

腾讯云大数据

一块屏幕的全球研发之旅

万事ONES

ONES 案例分析

元年云李彤:ToB产品应具备数据驱动和「宽能力」

ToB行业头条

安全专属的移动数字化平台WorkPlus加速国企数字化转型

WorkPlus

千万级车联网 MQTT 消息平台架构设计|车联网平台搭建从入门到精通 02

EMQ映云科技

架构 车联网 物联网 mqtt 分布式消息流平台

重磅!博睿数据发布新一代统一告警平台

博睿数据

测试环境与路由 | 阿里巴巴DevOps实践指南

阿里云云效

云计算 阿里云 运维 云原生 测试

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