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

Posted

技术标签:

【中文标题】如何正确地将复杂属性 (ArrayList<POJO>) 设置为 GWT BaseTreeModel?序列化问题【英文标题】:How correctly set complex property (ArrayList<POJO>) to the GWT BaseTreeModel? Serialization issues 【发布时间】:2014-01-17 06:43:32 【问题描述】:

我想通过 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。

但问题出在客户端 - 当我打印 each 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 属性和最后一个 ArrayList 值,当我执行 set("lons",lons);

时,它只是简单地覆盖了以前的值

但我查看了 BaseTreeModel 代码,发现每个实例都使用自己的映射来存储属性。请注意,原始类型可以完美运行。我使用嵌套复杂类型的方式出了点问题。

UPD:

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

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

但在客户端我只看到最后一个 ArrayList 不知何故覆盖了其他人。

【问题讨论】:

看起来您使用的是 GXT 2。检查允许嵌套值的状态。值是真的吗? @El Hoss, System.out.println(isAllowNestedValues()); 在我的字段类中输出 true(( 所以,其他地方的问题。 字段如何声明? @El Hoss,在服务器端,我只是在循环内创建 new Field(id,lons,lats) 并填充 ArrayList&lt;Field&gt; 以便稍后发送。服务器端没问题,看更新。 【参考方案1】:

问题已通过将 ArrayList&lt;Double&gt; 替换为 Double[] 解决。看起来这是序列化的副作用。我的意思是默认情况下可以序列化基元或基元数组,而序列化地图、列表和其他复杂数据结构需要使用属性和一些魔法) 无论如何,我很感兴趣如何执行 set("property ",ComplexDataStructure) 在 BaseTreeModel 中,我将非常感谢您清理这些内容。

【讨论】:

第一步是使用普通对象而不是 GXT 2 ModelData 类型。例如,GXT 3 提供相同的基本存储、加载程序、小部件,但不要求您使用 ModelData 类型来保存您的数据,并且以相同的方式获得许可。

以上是关于如何正确地将复杂属性 (ArrayList<POJO>) 设置为 GWT BaseTreeModel?序列化问题的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将单击按钮属性值传递给表单提交事件?

如何正确地将复杂的 Swift 对象序列化/反序列化为 AWS Lambda 有效负载?

如何正确地将 DataReader 转换为 DTO/List<DTO>? [复制]

如何正确地将页面属性传递给局部视图?

如何正确地将对象 $push 到 MongoDB 模式属性中,类型:数组

如何正确地将所需的 HTML 属性设置为 TymeLeaf 页面的输入标记?