天天看点

Java对象的XML序列化和反序列化 - (5)

现在来看看JAXB是否可以将数组、列表这样的对象序列化。

演示程序如下:

public void runJAXBObjectList()
   {
      String xmlFile = ".\\jaxb4list.xml";
      List<PureDataObject> pdos = new Vector<PureDataObject>();
      pdos.add(new PureDataObject(0, "first", 1.0, true));
      pdos.add(new PureDataObject(1, "second", 2.0, false));
      pdos.add(new PureDataObject(2, "third", 3.0, true));
      pdos.add(new PureDataObject(3, "fourth", 4.0, false));
      System.out.println("the number in arraylist is: " + pdos.size());
      JAXB.marshal(pdos, xmlFile);
   }
           

运行之后,生成的jaxb4list.xml内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<vector/>
           

可以看到,XML文件里没有数据!这说明JAXB无法直接序列化数组、列表类型的对象。那么,如果要将数组、列表之类的对象序列化该怎么办呢?解决办法就是将此类对象作为某一个类的数据成员,就可以被JAXB序列化和反序列化了。

以下是一个包含了对象列表和对象数组的类:

import java.util.List;
import java.util.Vector;

public class ObjectWithArrayAndList
{
   public ObjectWithArrayAndList()
   {
      pdoList = new Vector<PureDataObject>();
      noArray = new NestedObject[4];
      itemCount = 0;
   }

   public void add(PureDataObject pdo, NestedObject no)
   {
      pdoList.add(pdo);
      noArray[itemCount] = no;
      itemCount ++;
   }

   public List<PureDataObject> pdoList;
   public NestedObject[] noArray;

   private int itemCount;
}
           

下面是演示程序:

public void runJAXBObjectWithArrayAndList()
   {
      String xmlFile =  ".\\jaxb4listinobject.xml";
      ObjectWithArrayAndList owal = new ObjectWithArrayAndList();
      owal.add(new PureDataObject(0, "first", 1.0, true), new NestedObject(new PureDataObject(0, "first", 1.0, false), "group-1"));
      owal.add(new PureDataObject(1, "second", 2.0, false), new NestedObject(new PureDataObject(1, "second", 1.1, true), "group-2"));
      owal.add(new PureDataObject(2, "third", 3.0, true), new NestedObject(new PureDataObject(2, "third", 1.2, false), "group-3"));
      JAXB.marshal(owal, xmlFile);
   }
           

以下是生成的jaxb4listinobject.xml的内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<objectWithArrayAndList>
    <pdoList>
        <id>0</id>
        <name>first</name>
        <value>1.0</value>
        <valid>true</valid>
    </pdoList>
    <pdoList>
        <id>1</id>
        <name>second</name>
        <value>2.0</value>
        <valid>false</valid>
    </pdoList>
    <pdoList>
        <id>2</id>
        <name>third</name>
        <value>3.0</value>
        <valid>true</valid>
    </pdoList>
    <noArray>
        <pdo>
            <id>0</id>
            <name>first</name>
            <value>1.0</value>
            <valid>false</valid>
        </pdo>
        <groupName>group-1</groupName>
    </noArray>
    <noArray>
        <pdo>
            <id>1</id>
            <name>second</name>
            <value>1.1</value>
            <valid>true</valid>
        </pdo>
        <groupName>group-2</groupName>
    </noArray>
    <noArray>
        <pdo>
            <id>2</id>
            <name>third</name>
            <value>1.2</value>
            <valid>false</valid>
        </pdo>
        <groupName>group-3</groupName>
    </noArray>
    <noArray xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</objectWithArrayAndList>
           

可以看到,ObjectWithArrayAndList类中的列表和数组成员全部被XML序列化了。注意:ObjectWithArrayAndList对象初始化的时候,创建了包含4个元素的NestedObject数组,但是实际上只添加了3个元素,所以最后一个没赋值的元素被序列化成“<noArray xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>”这样的无值节点。