Ø JAXBContext:它是顺序的进口类,供应了XML/Java绑定的操纵,包含marshal、unmarshal等。
Ø Marshaller:它担任把Java对象序列化为对应的XML。
Ø Unmarshaller:它担任把XML反序列化为对应的Java对象。
序列化
举行序列化的基础操纵步骤以下:
//1、猎取一个基于某个class的JAXBContext,即JAXB上下文 JAXBContext jaxbContext = JAXBContext.newInstance(obj.getClass()); //2、应用JAXBContext对象建立对象的Marshaller实例。 Marshaller marshaller = jaxbContext.createMarshaller(); //3、设置一些序列化时须要的指定的设置 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); StringWriter writer = new StringWriter(); //4、将对象举行序列化 marshaller.marshal(obj, writer);
1、 建立一个JAXB上下文对象。
2、 应用JAXB上下文对象建立对应的Marshaller对象。
3、 指定序列化时的设置参数,细致能够设置的参数和对应的参数的寄义能够参考API文档。
4、 末了一步是将对应的对象序列化到一个Writer、OutputStream、File等输出对象中,细致能够参考Marshaller接口的API文档。
运用JAXB举行对象的序列化时对应的对象范例必需是javax.xml.bind.JAXBElement范例,或者是运用了javax.xml.bind.annotation.XmlRootElement注解标注的范例。XmlRootElement用于标注在class上面,示意把一个class映照为一个XML Element对象。与之相配合运用的注解一般另有XmlElement和XmlAttribute。XmlElement注解用于标注在class的属性上,用于把一个class的属性映照为一个XML Element对象。XmlAttribute注解用于标注在class的属性上,用于把一个class的属性映照为其class对应的XML Element上的一个属性。默许情况下,当我们的一个属性没有运用XmlElement标注时也会被序列化为Xml元素的一个子元素,假如我们不愿望Java对象中的某个属性被序列化则能够在对应的属性或对应的get要领上采纳XMLTransient举行标注。
示例
Person类
@XmlRootElement public class Person { private Integer id; private String name; private Integer age; private Address address; @XmlAttribute(name = "id") public Integer getId() { returnid; } public void setId(Integer id) { this.id = id; } @XmlAttribute public String getName() { returnname; } public void setName(String name) { this.name = name; } @XmlElement public Integer getAge() { returnage; } public void setAge(Integer age) { this.age = age; } @XmlElement public Address getAddress() { returnaddress; } public void setAddress(Address address) { this.address = address; } }
Address类
@XmlRootElement public class Address { private Integer id; private String province; private String city; private String area; private String other; @XmlAttribute(name="id") public Integer getId() { returnid; } public void setId(Integer id) { this.id = id; } @XmlElement public String getProvince() { returnprovince; } public void setProvince(String province) { this.province = province; } @XmlElement public String getCity() { returncity; } public void setCity(String city) { this.city = city; } @XmlElement public String getArea() { returnarea; } public void setArea(String area) { this.area = area; } @XmlElement public String getOther() { returnother; } public void setOther(String other) { this.other = other; } }
测试要领
@Test public void testMarshal() throws JAXBException { JAXBContext context = JAXBContext.newInstance(Person.class); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); StringWriter writer = new StringWriter(); Person person = new Person(); person.setId(1); person.setName("张三"); person.setAge(30); Address address = new Address(); address.setId(1); address.setProvince("广东省"); address.setCity("深圳市"); address.setArea("南山区"); address.setOther("别的"); person.setAddress(address); marshaller.marshal(person, writer); System.out.println(writer.toString()); }
输出效果
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <person id="1" name="张三"> <address id="1"> <area>南山区</area> <city>深圳市</city> <other>别的</other> <province>广东省</province> </address> <age>30</age> </person>
反序列化
举行反序列化的基础步骤以下:
//1、建立一个指定class的JAXB上下文对象 JAXBContext context = JAXBContext.newInstance(Person.class); //2、经由过程JAXBContext对象建立对应的Unmarshaller对象。 Unmarshaller unmarshaller = context.createUnmarshaller(); File file = new File("D:\\person.xml"); //3、挪用Unmarshaller对象的unmarshal要领举行反序列化,吸收的参数能够是一个InputStream、Reader、File等 Person person = (Person) unmarshaller.unmarshal(file);
Unmarshaller对象在供应了一系列的unmarshal重载要领,对应的参数范例能够是File、InputStream、Reader等,细致的能够检察对应的API文档。
JAXB东西类
除了运用JAXBContext来建立Marshaller和Unmarshaller对象来完成Java对象和XML之间的互转外,Java还为我们供应了一个东西类JAXB。JAXB东西类供应了一系列的静态要领来简化了Java对象和XML之间的互转,只须要简朴的一行代码即可搞定。
@Test public void testMarshal1() { Person person = new Person(); person.setId(1); person.setName("张三"); person.setAge(30); Address address = new Address(); address.setId(1); address.setProvince("广东省"); address.setCity("深圳市"); address.setArea("南山区"); address.setOther("别的"); person.setAddress(address); JAXB.marshal(person, System.out); } @Test public void testUnmarshal1() { File xml = new File("D:\\person.xml"); Person person = JAXB.unmarshal(xml, Person.class); System.out.println(person); }
以上就是细致引见经由过程JAXB完成XML和对象之间的映照的细致内容,更多请关注ki4网别的相干文章!