序列化为 GWT AutoBean 时如何保留 LinkedHashMap 的顺序?
Posted
技术标签:
【中文标题】序列化为 GWT AutoBean 时如何保留 LinkedHashMap 的顺序?【英文标题】:How preserve order of LinkedHashMap while serializing to GWT AutoBean? 【发布时间】:2011-12-05 09:55:37 【问题描述】:我尝试使用 Map
、HashMap
和 LinkedHashMap
作为 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显然,至少在 GWT 2.4 中,GWT 中的 LinkedHashMap.clone()
返回一个 HashMap
,这与纯 Java 行为相反。 AutoBean 可能依赖于 clone(),这最终会弄乱顺序。
【讨论】:
以上是关于序列化为 GWT AutoBean 时如何保留 LinkedHashMap 的顺序?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 GWT 中使用 autobean 将 json 转换为 java 类
在 GWT 上使用 AutoBean 解析未知类型的 JSON 对象