我试图让一个普通的可怜人的数据持久化功能,将采取数据类的MutableSet和它序列化到磁盘。我想要一些易于原型设计的东西,并且可以每隔一段时间在该集合上调用“save()”,以便如果我的进程被终止,我可以稍后使用已保存条目的“load()”继续。科特林“out”和“in”和仿制药 - 正确使用
但是,即使在重读Generics页面之后,我仍然没有明白'*','in','out'和'Nothing'之间的区别。这SEEMS的工作没有抛出错误,但我不明白为什么他们都“出局”,我认为必须是“在”......或者更可能是我对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()
第二个选项效果很好,谢谢你解释“Nothing”! –