【问题标题】:Convert Any type in scala to Array[Byte] and back将 Scala 中的任何类型转换为 Array[Byte] 并返回
【发布时间】:2017-01-15 02:38:55
【问题描述】:

我的程序中有一个变量值声明为Any

我想将此值转换为Array[Byte]

如何序列化到Array[Byte] 并返回?我发现了与DoubleInt 等其他类型相关的示例,但与Any 无关。

【问题讨论】:

  • 不知道是什么的东西怎么能序列化呢?
  • 我也有同样的问题..它是用户的输入,可以是图像、数字、字符串..然后我需要将其转换为 Array[Byte] 以便我可以存储它到数据库
  • 如果是用户的输入,那已经是String了,不是吗?那么为什么不直接存储String
  • 据我所知它不是字符串,但它可以是任何东西。你的意思是将它转换为字符串?这是我不知道的项目的一部分。我只看到一个带有参数的接口,其中参数类型为 Any。
  • 假设它是可序列化的(例如,流不是),你如何将它反序列化为你不知道的类型?保留一个字节数组是最好的。

标签: scala serialization


【解决方案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。如果您愿意引入它,这也是一个可行的解决方案。
猜你喜欢
  • 2014-04-18
  • 2023-01-21
  • 2011-06-11
  • 2019-04-04
  • 2014-07-21
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多