Scala-Serialisierung/ - Deserialisierung des singleton-Objekt
Ich bin ganz neu in der scala-Programmiersprache, und ich Zeit brauchen, das folgende zu tun. Ich habe eine signleton Objekt wie folgt:
object MyObject extends Serializable {
val map: HashMap[String, Int] = null
val x: int = -1;
val foo: String = ""
}
Nun möchte ich vermeiden, zu serialisieren jedes Feld von diesem Objekt getrennt, so war es mir schwebte das ganze Objekt in eine Datei, und klicken Sie dann in der nächsten Ausführung des Programms, Lesen Sie die Datei und initialisieren Sie die singleton-Objekt aus. Gibt es eine Möglichkeit, dies zu tun?
Im Grunde, was ich will, ist, wenn die Serialisierung, die Datei nicht vorhanden ist, werden diese Variablen initialisiert werden, um neue Strukturen, während, wenn es vorhanden ist, werden die Felder initialisiert werden, von denen, die auf die Datei. Aber ich möchte vermeiden, dass serialisieren/Deserialisieren jedes Feld manuell...
UPDATE:
Hatte ich die Verwendung einer benutzerdefinierten deserializer, wie hier vorgestellt: https://issues.scala-lang.org/browse/SI-2403, da hatte ich Probleme mit einer benutzerdefinierten Klasse, die ich in der HashMap, die als Werte.
UPDATE2:
Hier ist der code, ich benutze zum serialisieren:
val store = new ObjectOutputStream(new FileOutputStream(new File("foo")))
store.writeObject(MyData)
store.close
Und den code zum Deserialisieren (in einer anderen Datei):
@transient private lazy val loadedData: MyTrait = {
if(new File("foo").exists()) {
val in = new ObjectInputStream(new FileInputStream("foo")) {
override def resolveClass(desc: java.io.ObjectStreamClass): Class[_] = {
try { Class.forName(desc.getName, false, getClass.getClassLoader) }
catch { case ex: ClassNotFoundException => super.resolveClass(desc) }
}
}
val obj = in.readObject().asInstanceOf[MyTrait]
in.close
obj
}
else null
}
Dank,
Hier ist es 🙂 aus irgendeinem Grund wurde es gepostet, bevor ich fertig schreiben...
Aus Neugier, was ist das? Reading config-Dateien vielleicht?
Im Grunde genommen habe ich ein system entwickelt habe, und ich will seine wichtigsten Daten-Struktur in eine Datei geschrieben, die für die Persistenz Gründen. Die Datenstruktur wird (irgendwann :)) sehr groß werden, und das ist der Grund, warum ich wollen, um zu vermeiden, dass die Serialisierung jedes Feld separat.
Anmerkung: Vermeiden Sie die Verwendung von
null
im Scala. Es ist wirklich nur vorhanden ist, um die Interoperabilität mit Java. Verwenden Option
statt, wenn sich etwas "leer".InformationsquelleAutor Y.K. | 2012-12-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kein muss die Serialisierung eines Objekts mit nur unveränderliche Felder (weil der compiler wird es für Sie tun...) gehe ich davon aus, dass das Objekt bietet Standard-Werte. Hier ist ein Weg, dies zu tun:
Starten, indem Sie einen Zug mit alle erforderlichen Felder aus:
Schreiben Sie dann ein Objekt mit den Standardeinstellungen:
Schließlich schreiben Sie eine Umsetzung Deserialisieren von Daten, wenn es existiert:
Ich schrieb die Antwort, ohne das Werk (mit lazy-laden von Variablen).
Sorry für die Verspätung. Ich verstehe deine Lösung, allerdings, Wenn ich bin, alles richtig zu machen, es wirft eine java.lang.StackOverflowError. ich denke, wenn ich Deserialisieren, rufe ich die gleiche Initialisierung wieder und wieder und wieder irgendwie... aber ich habe keine Ahnung warum! (Beachten Sie, dass ich mich ändern musste die getOrElse und die Option da war ich immer Fehler bei der Kompilierung zu einfach, wenn die Bedingungen, und ich hatte eine benutzerdefinierte deserializer -- für weitere Informationen über die letzteren siehe den edit in meinem post)
1. Ich habe einen kleinen Tippfehler (
getOrEsle
stattgetOrElse
), die ich gerade behoben. Der code mit der option, Sie muss jetzt funktionieren, wenn nicht die Fehlermeldung. 2. Wenn Sie serialisieren direktMyData
mitSerializable
markieren Sie dieloadedData
Feld als@transient
zu vermeiden, die eine unendliche Rekursion serialisieren.Hallo. Danke für die Antwort. Die Fehlermeldung über getOrElse ist wie folgt: `der Wert der Karte ist nicht Mitglied von die Option[MyTrait]". Und ich bekomme immer noch die Endlosschleife, selbst wenn ich daneben loadedData als Transient. Ich werde fügen Sie das Codebeispiel, wie ich serialisieren und Deserialisieren in meinem ursprünglichen post jetzt. Lassen Sie mich wissen, wenn Sie irgendwelche anderen Ideen :-). Danke!
InformationsquelleAutor paradigmatic