0
如何將Guava表寫入文件? 這樣做的最好方法是什麼? 表中的價值觀似乎並不重要。我的主要目標是寫作和閱讀表。將番石榴表值寫入java中的文件
如何將Guava表寫入文件? 這樣做的最好方法是什麼? 表中的價值觀似乎並不重要。我的主要目標是寫作和閱讀表。將番石榴表值寫入java中的文件
有多種方法可以爲持久性建模表,並且對於不同類型的表(例如,密集vs解析,數組表和基於數組的表等),不同的方法對於不同類型的表更好。
對於一般目的(即,用於任何特定類型的表中的未優化)我可能會持續存在以下:
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();
}
}
用法:列鍵
實施例實現這樣的陣列中的列密鑰的離:
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"
}
]
}