JAXB是否支持对ArrayList对象的ArrayList进行编组

时间:2012-09-23 09:31:35

标签: java jaxb marshalling

在我们的java应用程序中,我需要保存用户提供的多组值。为了处理这些数据,我使用的是ArrayList< ArrayList<对象>取代。当我将这些数据发送给JAXB marshaller时,它正在编写我的XMLElementWrapper和XMLElement名称,但它没有写出每个XMLElement的内容。在这个每个XMLElement应该是内部ArrayList。当我解组时,我得到相同大小的ArrayList,但内部ArrayList内容为空,大小为零。

我们有另一个ArrayList<对象>在编组和解组时,同一类中的实现正如预期的那样工作。

在编组ArrayList类型的对象时,我可能会出错? ArrayList<对象> > ?

2 个答案:

答案 0 :(得分:0)

我认为如果您的主变量是List,那么列表可以包含ArrayList类型的对象。因此您可能不需要将其定义为ArrayList,因为您可以定义与ArrayList相同的结构。

您可以尝试的另一个选项是创建另一个基本上包含列表的类。那么你的主类可能只是一个ArrayList,那么YourClass实际上可以包含它自己的列表。

我还建议使用List代替ArrayList。当我第一次启动Java时,我也使用了ArrayList,但是你想使用更通用的List接口。 ArrayList和其他类型实现List接口,因此您希望将变量定义为List incase下面的类型。

答案 1 :(得分:0)

@XmlJavaTypeAdapter(IdAdapter.class)
private ArrayList<ArrayList<String>> _dataSet = null;

private static class IdAdapter extends XmlAdapter<RowList, ArrayList<ArrayList<String>>>
{

    @Override
    public ArrayList<ArrayList<String>> unmarshal(RowList v)
            throws Exception
    {
        ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
        for(ColumnList myList:v.rowList)
        {
            list.add(myList.columnList);
        }
        return list;
    }

    @Override
    public RowList marshal(ArrayList<ArrayList<String>> v)
            throws Exception
    {
        RowList rowList = new RowList();
        for(ArrayList<String> innerList:v)
        {
            ColumnList myList = new ColumnList();
            myList.columnList = innerList;
            rowList.rowList.add(myList);
        }
        return rowList;
    }
}

@XmlRootElement(name="RowList")
private static class RowList
{
    @XmlElement(name="RowValues")
    ArrayList<ColumnList> rowList = new ArrayList<SpoolDataSet.ColumnList>();
}

@XmlRootElement(name="ColumnList")
private static class ColumnList 
{
    @XmlElement(name="ColumnValues")
    ArrayList<String> columnList = new ArrayList<String>();
}

我为ArrayList&gt;做了这个您也可以将字符串更改为对象。