【问题标题】:Does JAXB support marshalling of ArrayList of ArrayList objectJAXB 是否支持 ArrayList 对象的 ArrayList 编组
【发布时间】:2012-09-23 09:31:34
【问题描述】:

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

我们在同一个类中有另一个 ArrayList 实现,它在编组和解组时按预期工作。

如果编组 ArrayList > 类型的对象,我会在哪里出错?

【问题讨论】:

    标签: java jaxb marshalling


    【解决方案1】:

    我认为如果您的主要变量是一个列表,那么该列表可能包含本身类型为 ArrayList 的对象。所以你可能不需要把它定义为ArrayList,因为你可以定义和ArrayList一样的结构。

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

    我还建议为此使用 List 而不是 ArrayList。当我第一次启动 Java 时,我也在使用 ArrayList,但您想使用更通用的 List 接口。 ArrayList 和其他类型实现了 List 接口,因此您希望将变量定义为 List 以防其下的类型发生变化。

    【讨论】:

    • Logan,您能否详细说明您的第一个声明?
    • 根据您所说的变量的样子,对我来说,这与说您的主要变量是 ArrayList 相同。 “对象”的数组列表,但您的对象恰好是其他 ArrayList,所以不要说 ArrayList>,您可以只说 ArraList
    • 我同意您的想法,即实现一个包含列表的类并在我的实际数组列表中使用新的类对象。这是工作 !!谢谢!!
    【解决方案2】:
    @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 做了这个>你也可以将字符串更改为对象。

    【讨论】:

      猜你喜欢
      • 2013-07-09
      • 1970-01-01
      • 2012-10-21
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      相关资源
      最近更新 更多