我试图制作一个通用的穷人数据持久性函数,它将获取一个MutableSet数据类并将其序列化到磁盘。我想要一些易于原型制作的东西,并且可以每隔一段时间在集合上调用“save()”,这样如果我的进程被杀死,我以后可以使用已保存条目的“load()”恢复。
但即使在重新阅读泛型页面后,我也不太明白“*”、“输入”、“输出”和“无”之间的区别。这似乎可以正常工作而不会引发错误,但我不明白为什么它们都“出局”,我认为必须“入局”......或者更有可能我完全错误地理解了 Kotlin 泛型。有这样做的正确方法吗?
/** Save/load any MutableSet<Serializable> */
fun MutableSet<out Serializable>.save(fileName:String="persist_${javaClass.simpleName}.ser") {
val tmpFile = File.createTempFile(fileName, ".tmp")
ObjectOutputStream(GZIPOutputStream(FileOutputStream(tmpFile))).use {
println("Persisting collection with ${this.size} entries.")
it.writeObject(this)
}
Files.move(Paths.get(tmpFile), Paths.get(fileName), StandardCopyOption.REPLACE_EXISTING)
}
fun MutableSet<out Serializable>.load(fileName:String="persist_${javaClass.simpleName}.ser") {
if (File(fileName).canRead()) {
ObjectInputStream(GZIPInputStream(FileInputStream(fileName))).use {
val loaded = it.readObject() as Collection<Nothing>
println("Loading collection with ${loaded.size} entries.")
this.addAll(loaded)
}
}
}
data class MyWhatever(val sourceFile: String, val frame: Int) : Serializable
然后能够启动任何应用程序
val mySet = mutableSetOf<MyWhatever>()
mySet.load()