我知道你可以將一個scala對象標記爲@serializable
,但我不明白該如何處理對象。我只是簡單地把它當作一個Java Serializable對象嗎?如何使用@serializable scala對象?
我想序列化成一個字節流的對象。有人可以向我展示將序列化對象轉換爲字節數組或字符串的代碼嗎?
(谷歌在沒有被這個問題有幫助)
後續:謝謝。我現在明白我可以像Java Serializable
這樣的對象使用它。有時顯而易見的答案逃避了我。
我知道你可以將一個scala對象標記爲@serializable
,但我不明白該如何處理對象。我只是簡單地把它當作一個Java Serializable對象嗎?如何使用@serializable scala對象?
我想序列化成一個字節流的對象。有人可以向我展示將序列化對象轉換爲字節數組或字符串的代碼嗎?
(谷歌在沒有被這個問題有幫助)
後續:謝謝。我現在明白我可以像Java 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$...
如果你想序列化到一些字符串格式,或許this library可能是有用的,哪些序列化Scala的對象爲JSON 。
一般來說,我不會推薦序列化對象,但它可能是一種通過網絡發送「全局狀態」的方法。
至於如何發送/接收數據,請查看java.io.ObjectOutputStream和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
您會看到......頂層對象在序列化中並不能很好地工作。但是嵌套對象可以被序列化。例如:
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
希望幫助!