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