糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > Java 序列化之JAXB 注解大全(一)

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

时间:2021-05-09 21:07:15

相关推荐

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 = "")@XmlType(name = "peopleType",namespace = "",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 = "")public String getDocx() {return docx;}public void setDocx(String docx) {this.docx = docx;}@XmlElement(name = "defName",required = true,namespace = "")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) {pany = company;}@XmlElement(nillable = false)@XmlElementWrapper(name = "infomations")public List<String> getInfomation() {return infomation;}public void setInfomation(List<String> infomation) {this.infomation = infomation;}@Overridepublic 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="" xmlns:ns3=""><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进行讲解和应用。

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

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

如果觉得《Java 序列化之JAXB 注解大全(一)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。