有序的发电机地图结构? (不使用marshalerl)

时间:2015-06-26 06:25:05

标签: amazon-web-services amazon-dynamodb

是否有任何Dynamo结构的功能类似于Java中的LinkedHashMap,我不需要为其创建自定义编组器?

作为一个附带问题,Dynamo中的列表排序是否保留正确?

2 个答案:

答案 0 :(得分:1)

DynamoDB supports the following types

标量和标量集:N,NS,S,SS,B,BS,Null,布尔

文件:地图,清单

有序地图不属于受支持的类型。如果使用Mapper作为LinkedHashMap,则需要创建自定义编组器。

保留列表顺序。订单无法保证。

答案 1 :(得分:0)

您可以将订单保留地图表示为键/值对列表:

[
  {"key": "one", "value": ... },
  {"key": "two", "value": ... },
  ...
]

在不使用自定义marshaller / unmarshaller的情况下进行翻译相对容易:

@DynamoDBDocument
public class MapEntry {
    private String key;
    private Whatever value;

    // constructor, getters and setters
}

@DynamoDBTable(tableName="whatever")
public class YourTable {
    private LinkedHashMap<String, Whatever> map;

    @DynamoDBIgnore // Don't store this directly or order will be lost
    public LinkedHashMap<String, Whatever> getMap() {
        return map;
    }

    public void setMap(LinkedHashMap<String, Whatever> map) {
        this.map = map;
    }

    // mapper will save/load using these instead; convert between
    // map and list of entries on the fly.

    public List<MapEntry> getMapEntries() {
        if (map == null) return null;

        List<MapEntry> entries = new ArrayList<>(map.size());
        for (Map.Entry<String, Whatever> entry : map.entrySet()) {
            entries.add(new MapEntry(entry.getKey(), entry.getValue()));
        }

        return entries;
    }

    public void setMapEntries(List<MapEntry> entries) {
        map = new LinkedHashMap<String, Whatever>();
        for (MapEntry entry : entries) {
            map.put(entry.getKey(), entry.getValue());
        }
    }
}