diff --git a/kernel/src/main/scala/serialization/Serializable.scala b/kernel/src/main/scala/serialization/Serializable.scala new file mode 100644 index 0000000000..f28c68a335 --- /dev/null +++ b/kernel/src/main/scala/serialization/Serializable.scala @@ -0,0 +1,51 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ + +package se.scalablesolutions.akka.serialization + + +import com.twitter.commons.Json +import java.io.{StringWriter, ByteArrayOutputStream, ObjectOutputStream} +import reflect.Manifest +import sbinary.DefaultProtocol + +object Serializable { + trait Protobuf { + + } + + trait SBinary[T] extends DefaultProtocol { + def toBytes: Array[Byte] = toByteArray(this) + def getManifest: Manifest[T] = Manifest.singleType(this.asInstanceOf[T]) + } + + trait JavaJSON { + private val mapper = new org.codehaus.jackson.map.ObjectMapper + + def toJSON: String = { + val out = new StringWriter + mapper.writeValue(out, obj) + out.close + out.toString + } + + def toBytes: Array[Byte] = { + val bos = new ByteArrayOutputStream + val out = new ObjectOutputStream(bos) + mapper.writeValue(out, obj) + out.close + bos.toByteArray + } + } + + trait ScalaJSON { + def toJSON: String = { + Json.build(obj).toString.getBytes("UTF-8") + } + + def toBytes: Array[Byte] = { + Json.build(obj).toString.getBytes("UTF-8") + } + } +} \ No newline at end of file diff --git a/kernel/src/main/scala/util/Serializer.scala b/kernel/src/main/scala/util/Serializer.scala index b113e702d3..ce00bd9690 100644 --- a/kernel/src/main/scala/util/Serializer.scala +++ b/kernel/src/main/scala/util/Serializer.scala @@ -5,15 +5,17 @@ package se.scalablesolutions.akka.kernel.util import java.io.{ObjectOutputStream, ByteArrayOutputStream, ObjectInputStream, ByteArrayInputStream} +import reflect.Manifest +import sbinary.DefaultProtocol +import org.codehaus.jackson.map.ObjectMapper +import com.twitter.commons.Json -/** +/** * @author Jonas Bonér */ -trait Serializer { - def deepClone[T <: AnyRef](obj: T): T = in(out(obj), Some(obj.getClass.asInstanceOf[Class[T]])).asInstanceOf[T] - +trait Serializer { + def deepClone[T <: AnyRef](obj: T): T def out(obj: AnyRef): Array[Byte] - def in(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef } @@ -21,6 +23,8 @@ trait Serializer { * @author Jonas Bonér */ object JavaSerializationSerializer extends Serializer { + def deepClone[T <: AnyRef](obj: T): T = in(out(obj), None).asInstanceOf[T] + def out(obj: AnyRef): Array[Byte] = { val bos = new ByteArrayOutputStream val out = new ObjectOutputStream(bos) @@ -41,12 +45,11 @@ object JavaSerializationSerializer extends Serializer { * @author Jonas Bonér */ object JavaJSONSerializer extends Serializer { - import org.codehaus.jackson.map.ObjectMapper - - private val json = new ObjectMapper + private val json = new org.codehaus.jackson.map.ObjectMapper + + def deepClone[T <: AnyRef](obj: T): T = in(out(obj), Some(obj.getClass)).asInstanceOf[T] def out(obj: AnyRef): Array[Byte] = { - if (!json.canSerialize(obj.getClass)) throw new IllegalArgumentException("Can not serialize [" + obj + "] to JSON, please provide a JSON serializable object.") val bos = new ByteArrayOutputStream val out = new ObjectOutputStream(bos) json.writeValue(out, obj) @@ -67,24 +70,26 @@ object JavaJSONSerializer extends Serializer { * @author Jonas Bonér */ object ScalaJSONSerializer extends Serializer { - import org.codehaus.jackson.map.ObjectMapper - - private val json = new ObjectMapper + def deepClone[T <: AnyRef](obj: T): T = in(out(obj), None).asInstanceOf[T] def out(obj: AnyRef): Array[Byte] = { - if (!json.canSerialize(obj.getClass)) throw new IllegalArgumentException("Can not serialize [" + obj + "] to JSON, please provide a JSON serializable object.") - val bos = new ByteArrayOutputStream - val out = new ObjectOutputStream(bos) - json.writeValue(out, obj) - out.close - bos.toByteArray + Json.build(obj).toString.getBytes("UTF-8") } def in(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = { - if (!clazz.isDefined) throw new IllegalArgumentException("Can't deserialize JSON to instance if no class is provided") - val in = new ObjectInputStream(new ByteArrayInputStream(bytes)) - val obj = json.readValue(in, clazz.get).asInstanceOf[AnyRef] - in.close - obj + Json.parse(new String(bytes, "UTF-8")).asInstanceOf[AnyRef] } } + +/** + * @author Jonas Bonér + */ +object SBinarySerializer extends SBinarySerializer +trait SBinarySerializer extends DefaultProtocol { + def in[T](t : T)(implicit bin : Writes[T], m: Manifest[T]): Pair[Array[Byte], Manifest[T]] = + Pair(toByteArray(t), m) + + def out[T](array : Array[Byte], m: Manifest[T])(implicit bin : Reads[T]) = + read[T](new ByteArrayInputStream(array)) +} + diff --git a/lib/scala-json-1.0.jar b/lib/scala-json-1.0.jar new file mode 100644 index 0000000000..df0ec2eaa6 Binary files /dev/null and b/lib/scala-json-1.0.jar differ