如何正确地将复杂属性(ArrayList <pojo>)设置为GWT BaseTreeModel?序列化问题</pojo>

时间:2014-01-17 06:43:32

标签: java gwt serialization rpc gxt

我想通过GWT rpc传递我自己的POJO类。此类扩展具有set(String value,X property)方法的BaseTreeModel。

我创建了许多POJO对象,设置了它们的属性,但在客户端,当我处理POJO的传入数组时,我看到仅原始类型被正确序列化。我的POJO课程

public class Field extends BaseTreeModel implements Serializable
{
      private static final long serialVersionUID = 17832464L;


    public Field()
    {

    }


    public Field(int id,ArrayList<Double> lons,ArrayList<Double> lats)
    {
        set("id",id); 
        set("lons",lons);
        set("lats",lats);
        System.out.println("adding polygon in field constructor "+id);
        for(int i=0;i<lons.size();i++)System.out.println(lons.get(i)+" "+ lats.get(i));
    } 
}

调试输出显示ArrayList的所有值都是正确的,并且按预期来自DB。

但问题出现在客户端 - 当我打印每个 POJO类的所有属性时,只有原始属性(整数id)对于所有条目都不同,但所有条目的ArrayList属性相同

客户代码:

for(Field field:fields)
        {

            System.out.println("adding polygon to map "+field.get("id"));
            ArrayList<Double> lons = (ArrayList<Double>)field.get("lons");
            ArrayList<Double> lats = (ArrayList<Double>)field.get("lats");

            for(int i=0;i<lons.size();i++)
            {
                System.out.println(lons.get(i)+" "+ lats.get(i));
             }
         }

初始化调试输出是正确的并向我展示(当然我发布假坐标,值无关紧要)

在字段构造函数1中添加多边形

1 1

1 1

在字段构造函数2中添加多边形

2 2

2 2

但收到调试输出显示我

在字段构造函数1中添加多边形

2 2

2 2

在字段构造函数2中添加多边形

2 2

2 2

看起来GWT使用一些全局映射来存储BaseTreeModel属性,并且当我执行set("lons",lons);

时,只是覆盖以前的值的最后一个ArrayList值

但我查看了BaseTreeModel代码并发现每个实例都使用它自己的地图来标记属性。请注意,原始类型可以很好地工作。我使用嵌套复杂类型的方式有问题。

UPD:

我仍然没有解决这个问题,但似乎我已将其本地化了。序列化问题。我定义应该设置BaseTreeModel类的一些属性,但我不知道要更改的确切属性。当我用set("lons"lons)设置数据后立即在服务器端提取数据时,一切正常。

ArrayList<Double> lons = (ArrayList<Double>)field.get("lons"); // works on server side

但是在客户端我只看到最后一个ArrayList,它以某种方式覆盖了其他人。

1 个答案:

答案 0 :(得分:0)

通过将ArrayList<Double>替换为Double[]来解决问题。看起来这是序列化的副作用。我的意思是默认情况下序列化基元或基元数组是可用的,而序列化地图,列表和其他复杂的数据结构需要使用属性和一些魔法玩法)

无论如何,我很感兴趣如何执行set( BaseTreeModel中的“property”,ComplexDataStructure)我将非常感谢清理。