2010-08-09 7 views
7

Ahora entiendo que los objetos scala @serializable se pueden usar de la misma manera que un objeto Serializable de Java. En un objeto Serializable de Java existen métodos que puede anular para cambiar la forma en que el objeto se ejecuta: writeObject (ObjectOutputStream)/readObject (ObjectOutputStream).¿Puede anular los escritores de flujo en objetos scala @serializable?

¿Puede anular o inyectar métodos en un objeto scala @serializable que le permite cambiar la serialización del objeto?

+0

Gracias! Me estaba equivocando la firma del método. –

Respuesta

8

Sí, puede utilizar los mismos métodos en Scala como en Java:

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

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

readObject returns Unit. ¿Qué es una implementación de ejemplo que hace un objeto? Dado que es un método en la instancia? Los ejemplos en java todos llaman this.someProperty para asignar valores. ¿Cómo funciona esto en scala con vals inmutables en las clases de casos? –

+0

@ScottSmith Sospecho que estás atrapado usando campos mutables o algunos trucos de reflexión realmente desagradables. –

3

Como ya se ha dicho, puede definir sus propios métodos y writeObject readObject.

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

Sin embargo, tenga cuidado al realizar esto en clases anidadas, objetos o rasgos.

@serializable clase Foo (x: Int) { @serializable objeto X {def y = x} }

Si serializar objeto X, será en realidad serializar la clase Foo que contiene, por lo que esto debe también ser serializable. Esto puede ser un PITA a tratar en los métodos de serialización personalizados, así que aquí hay una advertencia justa.

Otro punto de dolor puede ser la serialización de cierre. Trate de mantener un modelo mental de las variables que se capturan en cierres serializados. Asegúrese de que estas variables sean algo que desea enviar a través de IO.

Cuestiones relacionadas