如何在Rascal MPL中将数据序列化/反序列化到文件



我需要一种在Rascal中序列化数据的方法,因为有些操作可能相对较慢,并且需要一些快速的缓存形式。例如ASTs的构建。

我正在使用以下代码段从指定位置的项目中构建AST:

list[Declaration] getASTs(loc projectLocation) {
M3 model = createM3FromMavenProject(projectLocation);
list[Declaration] asts = [createAstFromFile(f, true)
| f <- files(model.containment), isCompilationUnit(f)];
return asts;
}

现在构建一个特定的AST需要一些时间(大约2-3秒(。因此,我希望将结果缓存在某个转储文件中:

loc smallsqlLoc = projectLoc + "smallsql0.21_src";
loc dumpLoc = projectLoc + "dump/smallsql.bin";
if(!exists(dumpLoc)) {
list[Declaration] dumpAsts = getASTs(smallsqlLoc);
writeFile(dumpLoc, dumpAsts);
}

并将其读回内存(希望会更快(:

if(!exists(dumpLoc))
throw "Error: dump does not exist.";
list[Declaration] asts = readFile(dumpLoc);

但是readFile的返回类型是str,而不是list[Declaration]。简单的演员阵容显然无法解决问题。如何将我最初写入文件的AST恢复到内存中?更一般地说,如何在Rascal中序列化和反序列化文件中的任何数据类型?

您正在寻找writeBinaryValueFile(和readBinaryValueFile(,它们负责读取和写入几乎任何流氓值(函数除外,我们无法序列化它们(。

您正在使用的writeFile用于文本文件,但这些文件不用于数据存储(除非您正在生成源代码(。

用法示例:

model = createM3FromMavenProject(projectLocation);
writeBinaryValueFile(|tmp:///test.cache|, model);
model2 = readBinaryValueFile(#M3, |tmp:///test.cache|);

因此,关于缓存,如果您想要跨运行时缓存,writeBinaryValueFile是最好的选择。如果您需要在同一会话中进行缓存,可以查看@memo标记,它的行为就像缓存。它没有被清楚地记录下来,但你可以看看围绕这个特性的测试:lang::rasp::tests:basic::Memoization。

最新更新