Java 序列化之JAXB 注解大全(一)

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

  JAXB主要通过注解进行节点标识,话不多说,接下来,直接对JAXB涉及的注解进行解释:

  · @XmlRootElement: 标识XML数据根节点,常与@XmlType,@XmlAccessorType,@XmlAccessorOrder一起使用。

   级别: 类。

   属性:

   ① name: 指定根节点名称,若未指定,则使用类名小写形式作为根节点名称。

   ② namespace: 指定根节点命名空间。

  · @XmlType: 将一个类映射到 XML 模式类型。类是通过属性和字段表示的值的数据容器。模式类型是一个数据容器,用于模式类型的内容模式中的模式组件(如模型组件、属性等)所表示的值。

   级别: 类。

   属性:

   ① name: 类映射的XML模型类型的名称。

   ② propOrder: 指定类型映射到XML模式复合类型时XML Schema元素的顺序。propOrder中列出的JavaBean属性或字段不得被@XmlTransient注释。propOrder定义的情况下,JavaBean中需要将所有参与属性或字段必须全部列出。

   ③ namespace: XML Schema类型的目标命名空间的名称,默认情况下,这是包含该类的包的映射目标命名空间。

   ④ factoryClass: 包含用于创建此类的实例的无参数工厂方法的类。

   ⑤ factoryMethod: 在factoryClass factoryClass()中指定的类中的无参工厂方法的名称。

  · @XmlAccessorType: 指定属性或字段是否进行默认序列化。

   级别: 类。

   属性:

   ① value: value值对应XmlAccessType枚举,XmlAccessType包含:

    1)PROPERTY:JavaBean中所有成对出现的getter/setter都将自动绑定到XML,由@XmlTransient注释的getter/setter除外。

    2)FIELD:JavaBean中所有非静态、非瞬态字段都将自动绑定到XML,由@XmlTransient注释的字段除外。

    3)PUBLIC_MEMBER:JavaBean中所有公共的成对出现的getter/setter和字段都将自动绑定到XML,由@XmlTransient注释的除外。

    4)NONE:默认所有内容都不自动绑定到XML。

    上面XmlAccessType的几个枚举值,都提到自动绑定,即在类上设置其中任一值时,并不会影响到被特定注解注释的getter/setter、属性、字段等。

  · @XmlElement: 将getter/setter或非静态、非瞬态字段绑定到XML。

   级别: 字段、方法、参数。

   属性:

   ① name: XML元素名称,若未指定,则从JavaBean中取getter/setter或非静态、非瞬态字段作为默认值。

   ② nillable: 是否处理空参数。

​   ③ required: 指定该元素是否必需。

   ④ namespace: 指定XML绑定时命名空间。

   ⑤ defaultValue: 指定XML绑定时默认值。

   ⑥ type: 指定getter/setter或非静态、非瞬态字段的关联类型。

  · @XmlElementWrapper: 围绕getter/setter或非静态、非瞬态字段生成一个包装元素。

   级别: 字段、方法。

   属性:

   ① name: 指定包装元素的名称,默认从JavaBean中取默认值。

   ② namespace: 指定包装元素的命名空间。

   ③ nillable: 是否处理空参数。

   ④ required: 指定该元素是否必需。

  · @XmlAttribute: 被@XmlAttribute注释的字段、方法,将被绑定为本类对应元素的属性。属性名取getter/setter或非静态、非瞬态字段作为默认值。

   级别: 字段、方法。

   属性:

   ① name: 属性名称,默认情况下,在不指定的情况下,默认是从JavaBean取默认值作为属性名。指定的情况下,使用name的值作为属性名。

   ② namespace: 指定属性名对应的命名空间。

   ③ required: 指定该属性是否必需。

​  · @XmlTransient: 被@XmlTransient注释的类、字段、方法,在进行XML绑定时将被忽略,和序列化时transient关键字作用类似。

   级别: 类、字段、方法。

  · JavaBean定义

  此JavaBean中除@XmlTransient外,其他均在JavaBean中进行了使用,如下:

package com.arhorchin.securitit.serialize.jaxb;

import java.util.List;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

/**
 * @author Securitit.
 * @note JAXB演示Bean.
 */
@XmlRootElement(
        name = "people",
        namespace = "http://www.securitit.com")
@XmlType(
        name = "peopleType",
        namespace = "http://www.securitit.com",
        propOrder = { "address", "name", "company", "infomation" },
        factoryClass = PeopleFactory.class,
        factoryMethod = "createPeople")
// @XmlAccessorType(XmlAccessType.FIELD)
public class People {

    /**
     * docx.
     */
    private String docx;

    /**
     * name.
     */
    private String name;

    /**
     * address.
     */
    private String address;

    /**
     * company.
     */
    private String company;

    /**
     * infomation.
     */
    private List<String> infomation;

    @XmlAttribute(
            name = "docx",
            namespace = "http://wwww.Securitit.com")
    public String getDocx() {
        return docx;
    }

    public void setDocx(String docx) {
        this.docx = docx;
    }

    @XmlElement(
            name = "defName",
            required = true,
            namespace = "http://www.securitit.com")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlElement(
            defaultValue = "---")
    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @XmlElement(
            nillable = false)
    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    @XmlElement(
            nillable = false)
    @XmlElementWrapper(
            name = "infomations")
    public List<String> getInfomation() {
        return infomation;
    }

    public void setInfomation(List<String> infomation) {
        this.infomation = infomation;
    }

    @Override
    public String toString() {
        return "{\"name\": \"" + name + "\", \"address\": \"" + address + "\", \"company\": \"" + company
                + "\", \"infomation\": \"" + infomation + "\"}";
    }

}

​  在定义JavaBean时有几点需要注意:

   ① 使用@XmlElement注解时,需要注意属性定义与getter之间的冲突,会引起类似<有两个名为 “xxxxx” 的属性>的错误,此时我们@XmlElement标注在getter上,以避免这种问题。

   ② @XmlAccessorType与@XmlElement具有相似的语义,要避免相同的getter/setter、属性和字段同时拥有两者的语义。

​   ③ @XmlElementWrapper必须应用在集合属性上,单一属性会出现异常。

   ④ 上面定义的JavaBean,包含了文中所涉及的注解及注解属性。

  · 测试程序

  演示程序依赖于《Java 序列化之JAXB完全解读》中的工具类JaxbUtil,演示程序代码如下:

package com.arhorchin.securitit.serialize.jaxb;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Securitit.
 * @note JAXB演示测试.
 */
public class PeopleTester {

    public static void main(String[] args) {
        People bean = null;
        List<String> infoList = null;
        String xmlStr = null;
        People vBean = null;

        bean = new People();
        bean.setDocx("demo");
        bean.setName("Securitit");
        bean.setAddress("China");
        bean.setCompany("HHHH");
        infoList = new ArrayList<String>();
        infoList.add("first");
        infoList.add("second");
        infoList.add("third");
        bean.setInfomation(infoList);

        // 序列化.
        xmlStr = JaxbUtil.convertToXml(bean);
        System.out.println("---------------- 序列化结果  ----------------");
        System.out.println(xmlStr);
        vBean = JaxbUtil.convertToJavaBean(xmlStr, People.class);
        System.out.println("---------------- 反序列化结果  ----------------");
        System.out.println(vBean);
    }

}

  演示程序输出结果:

---------------- 序列化结果  ----------------
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:people ns1:docx="demo" xmlns:ns1="http://wwww.Securitit.com" xmlns:ns3="http://www.securitit.com">
    <address>China</address>
    <ns3:defName>Securitit</ns3:defName>
    <company>HHHH</company>
    <infomations>
        <infomation>first</infomation>
        <infomation>second</infomation>
        <infomation>third</infomation>
    </infomations>
</ns3:people>

---------------- 反序列化结果  ----------------
{"name": "Securitit", "address": "China", "company": "HHHH", "infomation": "[first, second, third]"}

  总结:

  · 本文针对常用的注解XmlRootElement、XmlType、XmlAccessorType、XmlElement、XmlElementWrapper、XmlAttribute、XmlTransient进行讲解和应用。

  · 其他注解会在后续的文章中一一讲解,以便大家学习。

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

猜你喜欢

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