2010-08-09 9 views
7

Ora capisco che gli oggetti scala @serializable possono essere utilizzati allo stesso modo di un oggetto Serializable Java. In un oggetto Serializable Java esistono metodi che è possibile sovrascrivere per modificare il flusso degli oggetti: writeObject (ObjectOutputStream)/readObject (ObjectOutputStream).È possibile sovrascrivere i writer di flusso negli oggetti scala @serializable?

È possibile eseguire l'override o l'iniezione di metodi in un oggetto scala @serializable che consente di modificare la modalità di serializzazione dell'oggetto?

+0

Grazie! Stavo sbagliando la firma del metodo. –

risposta

8

Sì, è possibile utilizzare gli stessi metodi di Scala come in Java:

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

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

readObject restituisce Unit. Cos'è un'implementazione di esempio che crea un oggetto? Dato che è un metodo sull'istanza? Gli esempi in java chiamano this.someProperty per assegnare valori. Come funziona questo in scala con valori immutabili su case classes? –

+0

@ScottSmith Sospetto che tu sia bloccato usando i campi mutabili o alcuni trucchi di riflessione davvero sgradevoli. –

3

Come già detto, è possibile definire i propri metodi writeObject e readObject.

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

Tuttavia fare attenzione quando si esegue questo su classi, oggetti o tratti nidificati.

@serializable classe Foo (x: Int) { @serializable oggetto X {def y = x}}

Se serializzare oggetto X, sarà effettivamente serializzare la classe Foo contenente, quindi questo deve anche essere serializzabile. Questo può essere un PITA da trattare con i metodi di serializzazione personalizzati, quindi ecco un avvertimento equo.

Un altro punto di dolore può essere la serializzazione di chiusura. Cerca di mantenere un modello mentale di quali variabili vengono catturate nelle chiusure serializzate. Assicurati che queste variabili siano qualcosa che vorresti essere inviato su IO!

Problemi correlati