2010-08-09 18 views
7

Je comprends maintenant que les objets scala @serializable peuvent être utilisés de la même manière qu'un objet Java Serializable. Dans un objet Java Serializable, il existe des méthodes que vous pouvez remplacer pour modifier le flux de l'objet: writeObject (ObjectOutputStream)/readObject (ObjectOutputStream).Pouvez-vous remplacer les écrivains de flux dans les objets scala @serializable?

Pouvez-vous remplacer ou injecter des méthodes dans un objet scala @serializable vous permettant de modifier la façon dont l'objet est sérialisé?

+0

Merci! Je recevais la signature de la méthode erronée. ReadObject renvoie –

Répondre

8

Oui, vous pouvez utiliser les mêmes méthodes que Scala en Java:

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

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

Unité. Qu'est-ce qu'un exemple d'implémentation qui fait un objet? Étant donné que c'est une méthode sur l'instance? Les exemples de Java appellent tous this.someProperty pour assigner des valeurs. Comment cela fonctionne-t-il en scala avec des vals immuables sur des classes de cas? –

+0

@ ScottSmith Je soupçonne que vous êtes coincé en utilisant des champs mutables ou des trucs de réflexion vraiment méchant. –

3

Comme nous l'avons dit, vous pouvez définir vos propres méthodes writeObject et readObject. Toutefois, soyez prudent lorsque vous effectuez cette opération sur des classes, des objets ou des traits imbriqués.

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

Si je sérialiser l'objet X, il fait sérialiser les contenant classe Foo, donc cela doit également être sérialisable. Cela peut être un PITA à traiter dans les méthodes de sérialisation personnalisées, alors voici un avertissement juste.

Un autre point de douleur peut être la sérialisation de fermeture. Essayez de garder un modèle mental de quelles variables sont capturées dans des fermetures sérialisées. Assurez-vous que ces variables sont quelque chose que vous voulez envoyer sur IO!