2017-03-02 63 views

回答

0

有多種方法可以爲持久性建模表,並且對於不同類型的表(例如,密集vs解析,數組表和基於數組的表等),不同的方法對於不同類型的表更好。

對於一般目的(即,用於任何特定類型的表中的未優化)我可能會持續存在以下:

  1. 行鍵
  2. 列的按鍵陣列的陣列
  3. 單元的陣列,其中每個單元包含以下:
    1. 其行鍵的排鍵的陣列中的索引
    2. 的IND

      class TableTypeHierarchyAdapter<R, C, V> implements JsonSerializer<Table<R, C, V>>, JsonDeserializer<Table<R, C, V>> { 
          @Override 
          public JsonElement serialize(Table<R, C, V> src, Type typeOfSrc, JsonSerializationContext context) { 
           JsonArray rowKeysJsonArray = new JsonArray(); 
           Map<R, Integer> rowKeyToIndex = new HashMap<>(); 
           for (R rowKey : src.rowKeySet()) { 
            rowKeyToIndex.put(rowKey, rowKeyToIndex.size()); 
            rowKeysJsonArray.add(context.serialize(rowKey)); 
           } 
           JsonArray columnKeysJsonArray = new JsonArray(); 
           Map<C, Integer> columnKeyToIndex = new HashMap<>(); 
           for (C columnKey : src.columnKeySet()) { 
            columnKeyToIndex.put(columnKey, columnKeyToIndex.size()); 
            columnKeysJsonArray.add(context.serialize(columnKey)); 
           } 
           JsonArray cellsJsonArray = new JsonArray(); 
           for (Table.Cell<R, C, V> cell : src.cellSet()) { 
            JsonObject cellJsonObject = new JsonObject(); 
            int rowIndex = rowKeyToIndex.get(cell.getRowKey()); 
            int columnIndex = columnKeyToIndex.get(cell.getColumnKey()); 
            cellJsonObject.addProperty("rowIndex", rowIndex); 
            cellJsonObject.addProperty("columnIndex", columnIndex); 
            cellJsonObject.add("value", context.serialize(cell.getValue())); 
            cellsJsonArray.add(cellJsonObject); 
           } 
           JsonObject tableJsonObject = new JsonObject(); 
           tableJsonObject.add("rowKeys", rowKeysJsonArray); 
           tableJsonObject.add("columnKeys", columnKeysJsonArray); 
           tableJsonObject.add("cells", cellsJsonArray); 
           return tableJsonObject; 
          } 
      
          @Override 
          public Table<R, C, V> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) { 
           Type typeOfR; 
           Type typeOfC; 
           Type typeOfV; 
           { 
            ParameterizedType parameterizedType = (ParameterizedType) typeOfT; 
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); 
            typeOfR = actualTypeArguments[0]; 
            typeOfC = actualTypeArguments[1]; 
            typeOfV = actualTypeArguments[2]; 
           } 
           JsonObject tableJsonObject = json.getAsJsonObject(); 
           JsonArray rowKeysJsonArray = tableJsonObject.getAsJsonArray("rowKeys"); 
           Map<Integer, R> rowIndexToKey = new HashMap<>(); 
           for (JsonElement jsonElement : rowKeysJsonArray) { 
            R rowKey = context.deserialize(jsonElement, typeOfR); 
            rowIndexToKey.put(rowIndexToKey.size(), rowKey); 
           } 
           JsonArray columnKeysJsonArray = tableJsonObject.getAsJsonArray("columnKeys"); 
           Map<Integer, C> columnIndexToKey = new HashMap<>(); 
           for (JsonElement jsonElement : columnKeysJsonArray) { 
            C columnKey = context.deserialize(jsonElement, typeOfC); 
            columnIndexToKey.put(columnIndexToKey.size(), columnKey); 
           } 
           JsonArray cellsJsonArray = tableJsonObject.getAsJsonArray("cells"); 
           ImmutableTable.Builder<R, C, V> builder = ImmutableTable.builder(); 
           for (JsonElement jsonElement : cellsJsonArray) { 
            JsonObject cellJsonObject = jsonElement.getAsJsonObject(); 
            int rowIndex = cellJsonObject.get("rowIndex").getAsInt(); 
            int columnIndex = cellJsonObject.get("columnIndex").getAsInt(); 
            R rowKey = rowIndexToKey.get(rowIndex); 
            C columnKey = columnIndexToKey.get(columnIndex); 
            V value = context.deserialize(cellJsonObject.get("value"), typeOfV); 
            builder.put(rowKey, columnKey, value); 
           } 
           return builder.build(); 
          } 
      } 
      

      用法:列鍵

考慮到這一點可以使用google/gson: A Java serialization/deserialization library that can convert Java Objects into JSON and back.

實施例實現這樣的陣列中的列密鑰的離:

Table<String, String, String> table = ImmutableTable.<String, String, String>builder() 
     .put("R1", "C1", "R1C1") 
     .put("R1", "C2", "R1C2") 
     .put("R2", "C1", "R2C1") 
     .put("R2", "C2", "R2C2") 
     .build(); 
Gson gson = new GsonBuilder() 
     .setPrettyPrinting() 
     .registerTypeHierarchyAdapter(Table.class, new TableTypeHierarchyAdapter()) 
     .create(); 
try (FileWriter writer = new FileWriter("table.json")) { 
    gson.toJson(table, writer); 
} 
try (FileReader reader = new FileReader("table.json")) { 
    Type typeOfTable = new TypeToken<Table<String, String, String>>() {}.getType(); 
    Table<String, String, String> readTable = gson.fromJson(reader, typeOfTable); 
    assert table.equals(readTable); 
} 

table.json:

{ 
    "rowKeys": [ 
    "R1", 
    "R2" 
    ], 
    "columnKeys": [ 
    "C1", 
    "C2" 
    ], 
    "cells": [ 
    { 
     "rowIndex": 0, 
     "columnIndex": 0, 
     "value": "R1C1" 
    }, 
    { 
     "rowIndex": 0, 
     "columnIndex": 1, 
     "value": "R1C2" 
    }, 
    { 
     "rowIndex": 1, 
     "columnIndex": 0, 
     "value": "R2C1" 
    }, 
    { 
     "rowIndex": 1, 
     "columnIndex": 1, 
     "value": "R2C2" 
    } 
    ] 
}