Java 序列化之JAXB完全解读

欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!

  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工具类.
 */
public class JaxbUtil {

    /**
     * JavaBean转换成xml 默认编码UTF-8.
     * @param obj JavaBean.
     * @return XML数据.
     */
    public static String convertToXml(Object obj) {
        return convertToXml(obj, "UTF-8");
    }

    /**
     * JavaBean转换成xml.
     * @param obj JavaBean.
     * @param encoding 字符集.
     * @return XML数据.
     */
    public static String convertToXml(Object obj, String encoding) {
        String result = null;
        try {
            JAXBContext context = JAXBContext.newInstance(obj.getClass());
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
            StringWriter 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.
     */
    @SuppressWarnings("unchecked")
    public static <T> T convertToJavaBean(String xml, Class<T> clazz) {
        T t = null;
        try {
            JAXBContext context = JAXBContext.newInstance(clazz);
            Unmarshaller 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.convertToXml(bean);
        System.out.println("---------------- 序列化结果  ----------------");
        System.out.println(xmlStr);
        vBean = JaxbUtil.convertToJavaBean(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"}

  总结

  · JaxbUtil工具类,复制即可使用,除包路径外无需做任何更改。

  · JAXB涉及众多注解,除了本文使用的@XmlRootElement,还有很多其他注解,将会在接下来的系列博文中进行详细讲解。

本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/securitit/article/details/107945711