将 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] 并返回?我发现了与DoubleInt 等其他类型相关的示例,但与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函数? [复制]

Scala 库将数字(Int、Long、Double)与 Array[Byte] 相互转换

scala 将 Array[String] 转换为案例类

scala强制转换不兼容类型而不会引发错误

将 Scala 数组转换为唯一排序列表的有效方法