现在来看看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"/>”这样的无值节点。