我正在从此link学习平面缓冲区,没有示例演示如何存储字典(地图)。 link中提到了“在Java / Csharp中存储字典”,但是我对此并不了解。我来自Java背景。如何在Java的Flatbuffers中存储字典/地图的任何示例都会有帮助
答案 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 文件,您将需要构建缓冲区。这必须从最里面的数据到最外面的数据完成。因此,您需要在您的 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 的过程中帮助其他人。