欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!
JAXB 简介
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
JAXB 2.0是JDK 1.6的组成部分。JAXB 2.2.3是JDK 1.7的组成部分。
JAXB API
· JAXBContext:应用入口,负责创建编组和解组实例。
· Marshaller:编组接口,用于将Java对象序列化为XML数据。
· Unmarshaller:解组接口,用于将XML数据反序列化为Java对象。
JAXB 工具类
依照本博客习惯,提供JAXB工具类,可以直接使用,完成Java Bean与XML的序列化和反序列化。
package com.arhorchin.securitit.serialize.jaxb;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
/**
* @author Securitit.
* @note JAXB XML转换标准实现.
*/
public class JaxbXmlUtil {
/**
* JavaBean转换成xml.
* @param obj JavaBean.
* @param encoding 字符集.
* @return XML数据.
*/
public static String javaBeanToXml(Object obj, String encoding) {
String result = null;
JAXBContext context = null;
Marshaller marshaller = null;
StringWriter writer = null;
try {
context = JAXBContext.newInstance(obj.getClass());
marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
writer = new StringWriter();
marshaller.marshal(obj, writer);
result = writer.toString();
} catch (Exception e) {
return null;
}
return result;
}
/**
* Xml转换成JavaBean.
* @param xml XML.
* @param clazz JavaBean类对象.
* @return JavaBean.
*/
public static <T> T xmlToJavaBean(String xml, Class<T> clazz) {
T t = null;
JAXBContext context = null;
Unmarshaller unmarshaller = null;
try {
context = JAXBContext.newInstance(clazz);
unmarshaller = context.createUnmarshaller();
t = (T) unmarshaller.unmarshal(new StringReader(xml));
} catch (Exception e) {
return null;
}
return t;
}
}
JAXB 工具类实例
首先新建一个JavaBean,用于进行序列化和反序列化的转换,如下:
package com.arhorchin.securitit.serialize.jaxb;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
/**
* @author Securitit.
* @note JAXB演示Bean.
*/
@XmlRootElement(
name = "people")
public class JaxbBean {
/**
* name.
*/
private String name;
/**
* address.
*/
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "{\"name\": \"" + name + "\", \"address\": \"" + address + "\"}";
}
}
接着,我们使用测试JaxbUtil进行序列化和反序列化测试,如下:
package com.arhorchin.securitit.serialize.jaxb;
/**
* @author Securitit.
* @note JaxbUtil测试类.
*/
public class JaxbUtilTester {
public static void main(String[] args) {
JaxbBean bean = null;
String xmlStr = null;
JaxbBean vBean = null;
bean = new JaxbBean();
bean.setName("Securitit");
bean.setAddress("China");
// 序列化.
xmlStr = JaxbUtil.javaBeanToXml(bean, "UTF-8");
System.out.println("---------------- 序列化结果 ----------------");
System.out.println(xmlStr);
vBean = JaxbUtil.xmlToJavaBean(xmlStr, JaxbBean.class);
System.out.println("---------------- 反序列化结果 ----------------");
System.out.println(vBean);
}
}
运行输出结果如下:
---------------- 序列化结果 ----------------
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<people>
<address>China</address>
<name>Securitit</name>
</people>
---------------- 反序列化结果 ----------------
{"name": "Securitit", "address": "China"}
总结
· JaxbXmlUtil工具类,复制即可使用,除包路径外无需做任何更改。
· JAXB涉及众多注解,除了本文使用的@XmlRootElement,还有很多其他注解,将会在接下来的系列博文中进行详细讲解。
本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!