2010-08-09 24 views
12

Sé que puede marcar un objeto scala como @serializable, pero después no entiendo qué hacer con el objeto. ¿Simplemente lo trato como un objeto Serializable de Java?¿Cómo uso un objeto scala @serializable?

Quiero serializar el objeto en una secuencia de bytes. ¿Puede alguien mostrarme el código para transformar un objeto de serialización en una matriz de bytes o una cadena?

(las gafas no han sido de gran ayuda con esta pregunta)

Seguimiento: Gracias. Ahora entiendo que puedo usarlo como un objeto Java Serializable. A veces la respuesta obvia se me escapa.

Respuesta

12

para responder a su primera pregunta: sí se puede tratar como un objeto serializable Java:


scala> @serializable object A 
defined module A 

scala> import java.io.ByteArrayOutputStream; 
import java.io.ByteArrayOutputStream 

scala> import java.io.ObjectOutputStream; 
import java.io.ObjectOutputStream 

scala> val baos = new ByteArrayOutputStream(1024) 
baos: java.io.ByteArrayOutputStream = 

scala> val o = new ObjectOutputStream(baos) 
o: java.io.ObjectOutputStream = [email protected] 

scala> o.writeObject(A) 

scala> baos.toByteArray 
res4: Array[Byte] = Array(-84, -19, 0, 5, 115, 114, 0, 24, 108, 105, 110, 101, 49, 51, 36, 111, 98, 106, 101, 99, 116, 36, 36, 105, 119, 36, 36, 105, 119, 36, 65, 36, 110, -104, -28, -53, -123, -97, -118, -36, 2, 0, 0, 120, 112) 

scala> object B 
defined module B 

scala> o.writeObject(B) 
java.io.NotSerializableException: B$ 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) 
    at .(:13) 
    at .() 
    at RequestResult$.(:9) 
    at RequestResult$.() 
    at RequestResult$scala_repl_result() 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$18.apply(Interpreter.scala:981) 
    at scala.tools.nsc.Interpreter$Request$... 

Si desea realizar una serie hasta cierto formato de cadena, tal vez this library pueden ser útiles, que serializa objetos Scala en JSON .

9

En general, no recomendaría serializar objetos, sin embargo, podría ser una forma de enviar su "estado global" a través de la red.

En cuanto a cómo enviar/recibir datos, consulte java.io.ObjectOutputStream y java.io.ObjectInputStream.

scala> trait Test { def x : Int } 
defined trait Test 

scala> @serializable object Foo { var x = 5 } 
defined module Foo 


scala> import java.io._              
import java.io._ 

scala> def write() { 
    | val output = new ObjectOutputStream(new FileOutputStream("test.obj")) 
    | output.writeObject(Foo) 
    | output.close() 
    | } 
write:()Unit 


scala> write() 

scala> def read() = { 
    | val input = new ObjectInputStream(new FileInputStream("test.obj")) 
    | val obj = input.readObject() 
    | input.close() 
    | obj 
    | } 
read:()java.lang.Object 

scala> Foo.x = 7 

scala> val r = read() 
r: Test = [email protected] 

scala> r.x 
res39: Int = 7 

Verá ... los objetos de nivel superior realmente no funcionan bien con la serialización. Sin embargo, un objeto anidado se puede serializar. Por ejemplo:

scala> @serializable 
    | class SomeClass(var y : Int) { 
    | @serializable object X extends Test { def x = y } 
    | } 
defined class SomeClass 


scala> def write(x : AnyRef) { 
    | val output = new ObjectOutputStream(new FileOutputStream("test.obj")) 
    | output.writeObject(x) 
    | output.close() 
    | } 
write: (x : AnyRef)Unit 

scala> def read[A] = { 
    | val input = new ObjectInputStream(new FileInputStream("test.obj")) 
    | val obj = input.readObject() 
    | input.close() 
    | obj.asInstanceOf[A] 
    | } 
read: [A]A 

scala> write(x.X) 

scala> val y = read[Test] 
y: Test = [email protected] 

scala> y.x 
res51: Int = 10 

scala> x.y = 20 

scala> x.X.x 
res52: Int = 20 

scala> y.x 
res53: Int = 10 

Espero que ayude!

Cuestiones relacionadas