天天看點

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"/>”這樣的無值節點。