详细介绍通过JAXB实现XML和对象之间的映射

    jaxb的全称是java architecture for xml binding,是一项可以通过xml产生java对象,也可以通过java对象产生xml的技术。jdk中关于jaxb部分有几个比较重要的接口或类,如:

Ø  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类

@XmlRootElementpublic 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类

@XmlRootElementpublic 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());   }

登录后复制

输出结果

    
        南山区        深圳市        其它        广东省    
    30

登录后复制

反序列化

         进行反序列化的基本步骤如下:

//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和对象之间的映射的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2418212.html

(0)
上一篇 2025年3月3日 02:14:02
下一篇 2025年2月27日 07:31:01

AD推荐 黄金广告位招租... 更多推荐

发表回复

登录后才能评论