将 Scala 中的任何类型转换为 Array[Byte] 并返回
Posted
技术标签:
【中文标题】将 Scala 中的任何类型转换为 Array[Byte] 并返回【英文标题】:Convert Any type in scala to Array[Byte] and back 【发布时间】:2017-01-15 02:38:55 【问题描述】:我的程序中有一个变量值声明为Any
。
我想将此值转换为Array[Byte]
。
如何序列化到Array[Byte]
并返回?我发现了与Double
或Int
等其他类型相关的示例,但与Any
无关。
【问题讨论】:
不知道是什么的东西怎么能序列化呢? 我也有同样的问题..它是用户的输入,可以是图像、数字、字符串..然后我需要将其转换为 Array[Byte] 以便我可以存储它到数据库 如果是用户的输入,那已经是String
了,不是吗?那么为什么不直接存储String
?
据我所知它不是字符串,但它可以是任何东西。你的意思是将它转换为字符串?这是我不知道的项目的一部分。我只看到一个带有参数的接口,其中参数类型为 Any。
假设它是可序列化的(例如,流不是),你如何将它反序列化为你不知道的类型?保留一个字节数组是最好的。
【参考方案1】:
这应该可以满足您的需求。这与使用 Java 的方式非常相似。
import java.io.ByteArrayInputStream, ByteArrayOutputStream, ObjectInputStream, ObjectOutputStream
object Serialization extends App
def serialise(value: Any): Array[Byte] =
val stream: ByteArrayOutputStream = new ByteArrayOutputStream()
val oos = new ObjectOutputStream(stream)
oos.writeObject(value)
oos.close()
stream.toByteArray
def deserialise(bytes: Array[Byte]): Any =
val ois = new ObjectInputStream(new ByteArrayInputStream(bytes))
val value = ois.readObject
ois.close()
value
println(deserialise(serialise("My Test")))
println(deserialise(serialise(List(1))))
println(deserialise(serialise(Map(1 -> 2))))
println(deserialise(serialise(1)))
【讨论】:
非常感谢这个作品。我还发现了以下..与您的解决方案有什么区别? 使用ois.close()
等——无括号符号应该保留给不改变状态的方法。
感谢 Mohan,我已经更新了答案以包含您对“close()”的建议,因为它在语义上比“close”更好地突出了关闭流的副作用【参考方案2】:
def anyTypeToByteArray(value: Any): Array[Byte] =
val valueConverted :Array[Byte] = SerializationUtils.serialize(value.isInstanceOf[Serializable])
valueConverted
def ByteArrayToAny(value: Array[Byte]): Any =
val valueConverted: Any = SerializationUtils.deserialize(value)
valueConverted
【讨论】:
你的使用第三方库。 正如 JasperM 提到的,这使用了 Apache commons。如果您愿意引入它,这也是一个可行的解决方案。以上是关于将 Scala 中的任何类型转换为 Array[Byte] 并返回的主要内容,如果未能解决你的问题,请参考以下文章
使用 Scala 将 Array[DenseVector] 转换为 CSV
如何使用scala将特定函数转换为apache spark中的udf函数? [复制]