http://zh.wikipedia.org/wiki/JAXB 写道
JAXB(Java Architecture for XML Binding简称JAXB)允许Java开发人员将Java类映射为XML表示方式。JAXB提供两种主要特性:将一个Java对象序列化为XML,以及反向操作,将XML解析成Java对象。换句话说,JAXB允许以XML格式存储和读取数据,而不需要程序的类结构实现特定的读取XML和保存XML的代码。
当规格复杂且经常变化时JAXB特别有用。在这种情况下,经常修改XML模式定义以与Java定义保持一致很花费时间并且容易产生错误。
JAXB是Java EE平台的API之一,同时是Java Web服务开发包 (JWSDP)的一部分。 JAXB也是Web服务互操作性技术(WSIT)的基础之一. JAXB是J2SE1.6的一部分。
JAXB 1.0是在Java社群过程中作为JSR 31开发出来的。JAXB 2.0是作为JSR 222开发的。这两个版本的参考实现可以从java.net下载。
当规格复杂且经常变化时JAXB特别有用。在这种情况下,经常修改XML模式定义以与Java定义保持一致很花费时间并且容易产生错误。
JAXB是Java EE平台的API之一,同时是Java Web服务开发包 (JWSDP)的一部分。 JAXB也是Web服务互操作性技术(WSIT)的基础之一. JAXB是J2SE1.6的一部分。
JAXB 1.0是在Java社群过程中作为JSR 31开发出来的。JAXB 2.0是作为JSR 222开发的。这两个版本的参考实现可以从java.net下载。
在CXF(2.7.0)里面的定义和实现包是以下两个:
在使用上个人感觉和xstream等工具是很类似的 毕竟实现对于使用者来说是透明的.
以下是一个简单的例子代码 因为是第一次写难免写错不要介意:
package org.cc.jaxb; import java.io.ByteArrayOutputStream; import java.io.StringReader; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; public class Client { public static void main(String[] args) throws JAXBException { ObjectFactory factory=new ObjectFactory(); Person person=factory.createPerson(); Address address=new Address(); address.setCountry("中国"); address.setStreet("西湖区"); address.setHouse("xxx街道xx号"); person.setAge(22); person.setBirthDate(new Date()); person.setName("cc"); person.setSex(true); person.setTempId(1); person.setAddress(address); List<String> favors=new ArrayList<String>(); favors.add("吃饭"); favors.add("睡觉"); person.setFavors(favors); JAXBContext jaxbContext=JAXBContext.newInstance("org.cc.jaxb"); Marshaller marshaller=jaxbContext.createMarshaller(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.setProperty(Marshaller.JAXB_ENCODING, "gbk"); marshaller.marshal(person, baos); StringBuffer sb = new StringBuffer(new String(baos.toByteArray())); System.out.println(sb.toString()); Unmarshaller unmarshaller=jaxbContext.createUnmarshaller(); StringReader reader = new StringReader(sb.toString()); Person per = (Person)unmarshaller.unmarshal(reader); System.out.println(per.getFavors()); } }
package org.cc.jaxb; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement @XmlAccessorType(XmlAccessType.PROPERTY) public class Address { private String country; private String street; private String house; public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getHouse() { return house; } public void setHouse(String house) { this.house = house; } }
package org.cc.jaxb; import java.util.Date; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; 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.XmlTransient; @XmlRootElement(name="Person") // 根名叫做Person @XmlAccessorType(XmlAccessType.FIELD) //非static类型和标明transient的会被处理 public class Person { @XmlAttribute //作为属性 public String name; @XmlAttribute //作为属性 private int age; @XmlAttribute //作为属性 private boolean sex; @XmlElement //作为一个元素 private Date birthDate; @XmlTransient // 标明不处理这个 private long tempId; private Address address; //另一个类型的对象 @XmlElementWrapper(name="list") //favors外包一层list private List<String> favors; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean isSex() { return sex; } public void setSex(boolean sex) { this.sex = sex; } public Date getBirthDate() { return birthDate; } public void setBirthDate(Date birthDate) { this.birthDate = birthDate; } public long getTempId() { return tempId; } public void setTempId(long tempId) { this.tempId = tempId; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public List<String> getFavors() { return favors; } public void setFavors(List<String> favors) { this.favors = favors; } }
package org.cc.jaxb; import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.XmlElementDecl; import javax.xml.bind.annotation.XmlRegistry; import javax.xml.namespace.QName; @XmlRegistry public class ObjectFactory { private final static QName _Person_QName =new QName("http://fair-jm.iteye.com","Person"); private final static QName _Adress_QName =new QName("http://fair-jm.iteye.com","Address"); public Person createPerson(){ return new Person(); } public Address createAddress(){ return new Address(); } @XmlElementDecl(namespace="http://fair-jm.iteye.com",name="Person") public JAXBElement<Person> createPerson(Person value){ return new JAXBElement<Person>(_Person_QName, Person.class, value); } @XmlElementDecl(namespace="http://fair-jm.iteye.com",name="Address") public JAXBElement<Address> createAddress(Address value){ return new JAXBElement<Address>(_Adress_QName,Address.class,value); } }
输出结果:
<?xml version="1.0" encoding="gbk" standalone="yes"?> <Person name="cc" age="22" sex="true" xmlns:ns2="http://fair-jm.iteye.com"> <birthDate>2013-05-12T14:21:48.486+08:00</birthDate> <address> <country>中国</country> <house>xxx街道xx号</house> <street>西湖区</street> </address> <list> <favors>吃饭</favors> <favors>睡觉</favors> </list> </Person> [吃饭, 睡觉]