添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
首发于 Java专栏

对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>