如何正确地将复杂属性 (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<Field>
以便稍后发送。服务器端没问题,看更新。
【参考方案1】:
问题已通过将 ArrayList<Double>
替换为 Double[]
解决。看起来这是序列化的副作用。我的意思是默认情况下可以序列化基元或基元数组,而序列化地图、列表和其他复杂数据结构需要使用属性和一些魔法) 无论如何,我很感兴趣如何执行 set("property ",ComplexDataStructure) 在 BaseTreeModel 中,我将非常感谢您清理这些内容。
【讨论】:
第一步是使用普通对象而不是 GXT 2ModelData
类型。例如,GXT 3 提供相同的基本存储、加载程序、小部件,但不要求您使用 ModelData
类型来保存您的数据,并且以相同的方式获得许可。以上是关于如何正确地将复杂属性 (ArrayList<POJO>) 设置为 GWT BaseTreeModel?序列化问题的主要内容,如果未能解决你的问题,请参考以下文章
如何正确地将复杂的 Swift 对象序列化/反序列化为 AWS Lambda 有效负载?
如何正确地将 DataReader 转换为 DTO/List<DTO>? [复制]