2010-08-09 10 views
7

Teraz rozumiem, że scala @serializable objects mogą być używane tak samo jak obiekt Serializable Java. W obiekcie Serializable Java istnieją metody, które można przesłonić, aby zmienić sposób strumieni obiektów: writeObject (ObjectOutputStream)/readObject (ObjectOutputStream).Czy można przesłonić twórców strumieni w obiektach SCALA?

Czy można przesłonić lub wstrzyknąć metody na obiekt scala @serializable, co pozwoli zmienić sposób serializowania obiektu?

+0

Dzięki! Podobał mi się podpis metody. –

Odpowiedz

8

Tak, można użyć tych samych metod w Scala jak w Javie:

@throws(classOf[IOException]) 
private def writeObject(out: ObjectOutputStream): Unit = // ... 

@throws(classOf[IOException]) 
private def readObject(in: ObjectInputStream): Unit = // ... 
+0

readObject zwraca Unit. Jaka jest przykładowa implementacja, która tworzy obiekt? Biorąc pod uwagę, że jest to metoda na instancji? Przykłady w java all wywołują this.someProperty, aby przypisać wartości. Jak to działa w scala z niezmiennymi vals na klasach przypadków? –

+0

@ScottSmith Podejrzewam, że utknąłeś przy użyciu zmiennych pól lub naprawdę paskudnych sztuczek refleksji. –

3

Jak już wspomniano, można zdefiniować własne metody writeObject i readObject.

@throws(classOf[java.io.IOException]) 
private def writeObject(out : java.io.ObjectOutputStream) : Unit = /* your definition here */ 

Należy jednak zachować ostrożność podczas wykonywania tej czynności na zagnieżdżonych klasach, obiektach lub cechach.

@serializable klasy Foo (x int) { @serializable Przedmiotem X {def Y = X} }

Jeśli serializacji obiektu X, będzie faktycznie serializacji zawierającej klasy foo więc pewnie również można serializować. Może to być PITA do radzenia sobie z niestandardowymi metodami serializacji, więc tutaj jest uczciwe ostrzeżenie.

Innym problemem związanym z bólem może być serializacja zamknięcia. Staraj się zachować mentalny model tego, jakie zmienne są przechwytywane w serializowanych zamknięciach. Upewnij się, że te zmienne są danymi, które chcesz przesłać za pośrednictwem IO!

Powiązane problemy