JDK6特性:JAXB2实现对象与XML相互转换(实践)

博客参考相关链接,代码中加入了JDK7的try - with - resource和catch多异常特性,体现了在Java编程中对JDK新特性的运用,有助于提升代码的功能和性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:

https://www.cnblogs.com/doudouxiaoye/p/5693441.html  

https://linbulu.iteye.com/blog/2295919

代码:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

public class JAXBDemo {
	public static void main(String[] args) {
		try {
			JAXBContext context = JAXBContext.newInstance(Department.class, Staff.class); 
			Marshaller marshaller = context.createMarshaller(); 

			marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); 
			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

			String xmlObj = null;
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			marshaller.marshal(getSimpleDepartment(), baos);
			xmlObj = new String(baos.toByteArray());
			System.out.println(xmlObj);
			baos.close();
			
			ByteArrayInputStream is = new ByteArrayInputStream(xmlObj.getBytes());
			Unmarshaller unmarshaller = context.createUnmarshaller();
			Department department = (Department) unmarshaller.unmarshal(is);
			System.out.println(department);
			is.close();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static Department getSimpleDepartment() {
		List<Staff> staffs = new ArrayList<>();

		Staff stf = new Staff();
		stf.setName("周杰伦");
		stf.setAge(30);
		stf.setSmoker(false);
		staffs.add(stf);
		stf.setName("周笔畅");
		stf.setAge(28);
		stf.setSmoker(false);
		staffs.add(stf);
		stf.setName("周星驰");
		stf.setAge(40);
		stf.setSmoker(true);
		staffs.add(stf);

		Department dept = new Department();
		dept.setName("娱乐圈");
		dept.setStaffs(staffs);

		return dept;
	}
}

@XmlRootElement(name = "department")
class Department {

	private String name;
	private List<Staff> staffs; 

	public String getName() {
		return name;
	}

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

	public List<Staff> getStaffs() {
		return staffs;
	}

	@XmlElement(name = "staff")
	public void setStaffs(List<Staff> staffs) {
		this.staffs = staffs;
	}

	@Override
	public String toString() {
		return "Department [name=" + name + ", staffs=" + staffs + "]";
	}
}

@XmlRootElement(name = "staff")
class Staff {

	private String name; 
	private int age; 
	private boolean smoker; 

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

	@XmlElement
	public void setAge(int age) {
		this.age = age;
	}

	public boolean isSmoker() {
		return smoker;
	}

	@XmlAttribute
	public void setSmoker(boolean smoker) {
		this.smoker = smoker;
	}

	@Override
	public String toString() {
		return "Staff [name=" + name + ", age=" + age + ", smoker=" + smoker + "]";
	}

}

加入JDK7特性,try-with-resource,catch 多异常

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

public class JAXBDemo {
	public static void main(String[] args) {
		try {
			JAXBContext context = JAXBContext.newInstance(Department.class, Staff.class); 
			Marshaller marshaller = context.createMarshaller();

			marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); 
			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 格式化

			String xmlObj = null;
			try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
				marshaller.marshal(getSimpleDepartment(), baos);
				xmlObj = new String(baos.toByteArray()); // 生成XML字符串
				System.out.println(xmlObj);
			}
			try (ByteArrayInputStream is = new ByteArrayInputStream(xmlObj.getBytes())) {
				Unmarshaller unmarshaller = context.createUnmarshaller();
				Department department = (Department) unmarshaller.unmarshal(is);
				System.out.println(department);
			}
		} catch (JAXBException | IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 生成一个简单的Department对象
	 * 
	 * @return
	 */
	private static Department getSimpleDepartment() {
		List<Staff> staffs = new ArrayList<>();

		Staff stf = new Staff();
		stf.setName("周杰伦");
		stf.setAge(30);
		stf.setSmoker(false);
		staffs.add(stf);
		stf.setName("周笔畅");
		stf.setAge(28);
		stf.setSmoker(false);
		staffs.add(stf);
		stf.setName("周星驰");
		stf.setAge(40);
		stf.setSmoker(true);
		staffs.add(stf);

		Department dept = new Department();
		dept.setName("娱乐圈");
		dept.setStaffs(staffs);

		return dept;
	}
}

@XmlRootElement(name = "department")
class Department {

	private String name;
	private List<Staff> staffs;

	public String getName() {
		return name;
	}

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

	public List<Staff> getStaffs() {
		return staffs;
	}

	@XmlElement(name = "staff")
	public void setStaffs(List<Staff> staffs) {
		this.staffs = staffs;
	}

	@Override
	public String toString() {
		return "Department [name=" + name + ", staffs=" + staffs + "]";
	}
}

@XmlRootElement(name = "staff")
class Staff {

	private String name;
	private int age;
	private boolean smoker;

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

	@XmlElement
	public void setAge(int age) {
		this.age = age;
	}

	public boolean isSmoker() {
		return smoker;
	}

	@XmlAttribute
	public void setSmoker(boolean smoker) {
		this.smoker = smoker;
	}

	@Override
	public String toString() {
		return "Staff [name=" + name + ", age=" + age + ", smoker=" + smoker + "]";
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值