From a3fac4338fcf72735a1a61bb0f9f30fc07ccc334 Mon Sep 17 00:00:00 2001 From: jboner Date: Tue, 21 Jul 2009 13:59:12 +0200 Subject: [PATCH] added scala-json lib --- .../scala/serialization/Serializable.scala | 51 ++++++++++++++++++ kernel/src/main/scala/util/Serializer.scala | 51 ++++++++++-------- lib/scala-json-1.0.jar | Bin 0 -> 37976 bytes 3 files changed, 79 insertions(+), 23 deletions(-) create mode 100644 kernel/src/main/scala/serialization/Serializable.scala create mode 100644 lib/scala-json-1.0.jar 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 0000000000000000000000000000000000000000..df0ec2eaa607156859f2b390da2e8769261899c1 GIT binary patch literal 37976 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 literal 0 HcmV?d00001