Двоичная сериализация — замена Marshal на scala 2.10

как я могу перенести этот старый код на scala 2.10, поскольку scala.util.Marshal устарел?

object Serilaizer{
 def objectToBytes[T](foo: T)(implicit expected: ClassManifest[T]): Array[Byte] = {
    Marshal.dump(foo)
  }
  def bytesToObject[T](fooBytes: Array[Byte])(implicit expected: ClassManifest[T]): Option[T] = {
    Some(Marshal.load[T](fooBytes))
    }
  }

Я видел SBinary, но он еще не выпущен.


person igx    schedule 18.03.2014    source источник


Ответы (1)


это то, что придумали до сих пор, реализовав оригинал Маршал дамп/загрузка кода (как в scala 2.9), не уверен, что это лучший способ, но вроде работает

object Serilaizer {
  def objectToBytes[T](foo: T): Array[Byte] = { // replace Marshal.dump(foo)
    val ba = new ByteArrayOutputStream()
    val out = new ObjectOutputStream(ba)
    out.writeObject(foo)
    out.close()
    ba.toByteArray
  }

  def bytesToObject[T](fooBytes: Array[Byte]): Option[T] = { // replace Marshal.load[T](foo)
    if (userDataBytes != null) {
      try {
        val in = new ObjectInputStream(new ByteArrayInputStream(fooBytes))
        val o = in.readObject.asInstanceOf[T]
        in.close()
        Some(o)
      }
      catch {
        case e: Exception => {
          throw new ClassCastException ("Serialization Problem", e)
          None
        }
      }
    }
    else {
      None
    }
  }
}
person igx    schedule 19.03.2014