如何在Java中的FlatBuffer中存储字典(map)

时间:2018-07-20 07:46:20

标签: java serialization deserialization flatbuffers

我正在从此link学习平面缓冲区,没有示例演示如何存储字典(地图)。 link中提到了“在Java / Csharp中存储字典”,但是我对此并不了解。我来自Java背景。如何在Java的Flatbuffers中存储字典/地图的任何示例都会有帮助

1 个答案:

答案 0 :(得分:0)

我意识到这是一个老问题,但是当我试图弄清楚同样的事情时我遇到了它。这是我为获得“字典/地图”所做的工作

架构文件

namespace com.dictionary;

table DataItem{
  keyValue:string(key);
  name:string;
  age:int;
  codes[string];
}

table DictionaryRoot{
  items:[DataItem];
}

root_type DictionaryRoot;

当您通过 FlatBuffers 编译器 flatc -j schema.fbs 运行它时,它将生成两个 Java 文件,一个名为 DictionaryRoot.java,另一个名为 DataItem.java

在您的 Java 应用程序中

使用这两个生成的 Java 文件,您将需要构建缓冲区。这必须从最里面的数据到最外面的数据完成。因此,您需要在您的 DataItems 之前构建您的 DictionaryRoot(并跟踪它们的偏移量)

在本例中,我们假设您有一个 Java 对象映射,需要从中创建缓冲区。

List<Integer> offsets = new ArrayList<>();
FlatBufferBuilder builder = new FlatBufferBuilder(1024);

for (Entry<String, DataObj> entry : map.entrySet()) {
  DataObj dataObj = entry.getValue();

  // use the builder to create the data and keep track of their offsets
  int keyValueOffset = builder.createString(entry.getKey());
  int nameOffset = builder.createString(dataObj.getName());
  int ageOffset = dataObj.getAge();
  int[] codesOffsets = dataObj.getCodes().stream().mapToInt(builder::createString)
      .toArray();

  // use the builder to create a vector using the offsets from above
  int codesVectorOffset = DataItem.createCodesVector(builder, codesOffsets);

  // now with all the inner data offsets, create the DataItem
  DataItem.startDataItem(builder);

  DataItem.addKeyValue(builder, keyValueOffset);
  DataItem.addName(builder, nameOffset);
  DataItem.addAge(builder, ageOffset);
  DataItem.addCodes(builder, codesVectorOffset);

  // ensure you 'end' the DataItem to get the offset
  int dataItemOffset = DataItem.endDataItem(builder);

  // track the offsets
  offsets.add(dataItemOffset);
}

// use the builder to create a sorted vector from your offsets. This is critical
int sortedVectorOffset = builder.createSortedVectorOfTables(new DataItem(),
    offsets.stream().mapToInt(Integer::intValue).toArray());

// now with your sorted vector, create the DictionaryRoot
DictionaryRoot.startDictionaryRoot(builder);

DictionaryRoot.addItems(builder, sortedVectorOffset);

int dictRootOffset = DictionaryRoot.endDictionaryRoot(builder);

// signal to the builder you are done
builder.finish(dictRootOffset);

// Write data to file
FileOutputStream outputStream = new FileOutputStream("output.bin");
outputStream.write(builder.sizedByteArray());
outputStream.close();

我希望这会在他们使用 FlatBuffers 的过程中帮助其他人。