问题描述
我知道您可以将 scala 对象标记为 @serializable
,但我不明白之后如何处理该对象.我是否只是将其视为 Java Serializable 对象?
我想将对象序列化为字节流.有人可以告诉我将序列化对象转换为字节数组或字符串的代码吗?
(谷歌对这个问题没有帮助)
跟进:谢谢.我现在明白我可以像使用 Java Serializable
对象一样使用它.有时,显而易见的答案让我无法理解.
回答您的第一个问题:是的,您可以将其视为 Java Serializable 对象:
Scala> @serializable 对象 A定义的模块 AScala> 导入 java.io.ByteArrayOutputStream;导入 java.io.ByteArrayOutputStreamScala> 导入 java.io.ObjectOutputStream;导入 java.io.ObjectOutputStreamScala> val baos = new ByteArrayOutputStream(1024)宝:java.io.ByteArrayOutputStream =Scala> val o = new ObjectOutputStream(baos)o: java.io.ObjectOutputStream = java.io.ObjectOutputStream@3d689405Scala> o.writeObject(A)Scala> baos.toByteArrayres4: Array[Byte] = Array(-84, -19, 0, 5, 115, 114, 0, 24, 108, 105, 110, 101, 49, 51, 36, 111, 98, 106, 101, 9, 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)标度>对象B定义的模块 BScala> o.writeObject(B)java.io.NotSerializableException: B$在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)在 .(:13)在 .()在 RequestResult$.(:9)在 RequestResult$.()在 RequestResult$scala_repl_result()在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在 java.lang.reflect.Method.invoke(Method.java:597)在 scala.tools.nsc.Interpreter$Request$$anonfun$loadAndRun$1$$anonfun$apply$18.apply(Interpreter.scala:981)在 scala.tools.nsc.Interpreter$Request$...如果你想序列化为某种字符串格式,也许这个库可能很有用,它可以序列化scala对象转换为 JSON.
I know that you can mark a scala object as @serializable
, but I don't understand what to do with the object afterwards. Do I simply treat it as a Java Serializable object?
I want to serialize the object into a stream of bytes. Can someone show me the code to transform a serialize object into either a byte array or a string?
(the googles have not been helpful with this question)
FOLLOWUP: Thanks. I now understand that I can use it like a Java Serializable
object. Sometimes the obvious answer escapes me.
To answer your first question: yes you can treat it as a Java Serializable object:
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 = java.io.ObjectOutputStream@3d689405
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$...
If you want to serialize to some string format, perhaps this library may be useful, which serializes scala objects into JSON.
这篇关于如何使用 @serializable scala 对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!