序列化为 GWT AutoBean 时如何保留 LinkedHashMap 的顺序?

Posted

技术标签:

【中文标题】序列化为 GWT AutoBean 时如何保留 LinkedHashMap 的顺序?【英文标题】:How preserve order of LinkedHashMap while serializing to GWT AutoBean? 【发布时间】:2011-12-05 09:55:37 【问题描述】:

我尝试使用 MapHashMapLinkedHashMap 作为 AutoBean 工厂的类型,并且总是在序列化后更改初始元素顺序。

我不想发送额外的ArrayList 来保存订单数据。有没有办法强制 AutoBean 在Map 中保持秩序?

【问题讨论】:

【参考方案1】:

http://docs.oracle.com/javase/6/docs/api/java/util/Map.html

地图的顺序定义为迭代器在 地图的集合视图返回它们的元素。一些地图 实现,如 TreeMap 类,做出具体保证 遵从他们的命令;其他的,比如 HashMap 类,则不需要。

GWT 不会对基于Map 的类进行任何更改。出于性能原因,Map 及其许多子类不保持插入顺序。 LinkedHashMap,按照设计,确实保持其插入顺序。也就是说,当然,假设您开始使用 LinkedHashMap,而不是从另一种类型的 Map 构造它,这可能在插入期间实际上不会保留其顺序,从而导致 LinkedHashMap获得与您预期不同的顺序。

我想知道为什么您仍然需要保留初始订单,如果您想要的话,为什么要使用 Map

【讨论】:

嗨,GWT 没有重新排序我的 LinkedHashMap。但是 AutoBean 在将映射序列化为 json 时会这样做。我用它来存储 column_name = row_value 对,它们取自网格模型,应该作为 Map 的列表导入 DynamicJasper xls 报告工厂。由于遗留原因,我不想更改该结构。我当前的解决方法是将列顺序作为另一个 List 传递。感谢上帝,AutoBean 以正确的顺序序列化列表。【参考方案2】:

显然,至少在 GWT 2.4 中,GWT 中的 LinkedHashMap.clone() 返回一个 HashMap,这与纯 Java 行为相反。 AutoBean 可能依赖于 clone(),这最终会弄乱顺序。

【讨论】:

以上是关于序列化为 GWT AutoBean 时如何保留 LinkedHashMap 的顺序?的主要内容,如果未能解决你的问题,请参考以下文章

GWT Autobean JSON 规范

如何在 GWT 中使用 autobean 将 json 转换为 java 类

在 gwt 中支持 autobean 包装的原因是啥

在 GWT 上使用 AutoBean 解析未知类型的 JSON 对象

GWT AutoBean:注释@PropertyName 不再起作用

没有设置方法的 GWT Autobean