对Java对象进行XML序列化和反序列化的实用类
以下内容参考孙卫琴姐姐的经典 Java书籍《Java网络编程核心技术详解》
把一个Java对象转换为XML数据,这一过程称为Java对象的XML序列化。把XML数据转换为Java对象,这一过程称为Java对象的XML反序列化。
Java对象的XML序列化数据可以方便地在网络上传输。例如在基于SOAP协议的Web服务框架中,通信双方就通过XML格式的数据来进行交互。客户端发出调用服务方法的请求,服务器端返回执行服务方法的结果。客户端的请求以及服务器端的响应都是XML序列化数据。
JDK运用Java反射机制,提供了对Java对象进行XML序列化的通用API,它能对满足以下条件的JavaBean(以Customer类为例)进行XML序列化和反序列化:
- 包含public类型的不带参数的构造方法。
- 对于需要参与XML序列化的属性,需要为该属性提供public类型的get方法;对于需要参与XML反序列化的属性,需要为该属性提供public类型的set方法。例如,如果希望对Customer类的name属性进行XML序列化,就需要提供getName()方法;如果希望对Customer类的name属性进行XML反序列化,就需要提供setName()方法。
JavaBean是一种符合特殊规范的Java类,它的属性具有相应的get方法和set方法,分别用于读取和设置属性。
以下例程1的SerializableXmlUtil类能够对满足以上条件的JavaBean进行XML序列化和反序列化。
例程1 SerializableXmlUtil.java
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
public class SerializableXmlUtil {
/** 把XML数据反序列化为 JavaBean*/
public static <T> T parseXML(String xmlText) {
XMLDecoder decoder=null;
try{
ByteArrayInputStream in =
new ByteArrayInputStream(xmlText.getBytes());
decoder = new XMLDecoder(new BufferedInputStream(in));
return (T) decoder.readObject();
}finally{
decoder.close();
/** 把JavaBean序列化为XML数据 */
public static <T> String formatXML(T entity) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(out));
encoder.writeObject(entity);
encoder.close();
return out.toString();
public static void main(String[] args) throws Exception {
Customer customer=new Customer(1,"Tom","shanghai",25);
String xmlText = formatXML(customer);
System.out.println("序列化为XML数据:\n" + xmlText);
customer = parseXML(xmlText);
System.out.println("反序列化生成JavaBean:\n" + customer);
}
SerializableXmlUtil类利用JDK中的以下两个类进行JavaBean的XML序列化和反序列化:
- java.beans.XMLEncoder:对JavaBean进行XML序列化,把JavaBean转换为XML数据。
- java.beans.XMLDecoder:对JavaBean进行XML反序列化,把XML数据转换为JavaBean。
SerializableXmlUtil类的main()方法把一个Customer对象序列化为XML文本数据,接下来又把这XML文本数据反序列化为Customer对象。本程序的打印结果如下:
序列化为XML数据:
<?xml version="1.0" encoding="UTF-8"?>
<java version="10" class="java.beans.XMLDecoder">
<object class="Customer">
<void property="addr">
<string>shanghai</string>
</void>
<void property="age">
<int>25</int>
</void>
<void property="id">
<long>1</long>
</void>
<void property="name">
<string>Tom</string>