diff --git a/akka-actor-tests/src/test/scala/akka/serialization/SerializeSpec.scala b/akka-actor-tests/src/test/scala/akka/serialization/SerializeSpec.scala index 01181d57aa..5f9a3418ec 100644 --- a/akka-actor-tests/src/test/scala/akka/serialization/SerializeSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/serialization/SerializeSpec.scala @@ -180,6 +180,10 @@ class SerializeSpec extends AkkaSpec(SerializeSpec.config) { } } + "use ByteArraySerializer for byte arrays" in { + ser.serializerFor(classOf[Array[Byte]]).getClass must be(classOf[ByteArraySerializer]) + } + } } diff --git a/akka-actor/src/main/resources/reference.conf b/akka-actor/src/main/resources/reference.conf index 6c023ba6dd..bdd45c9dac 100644 --- a/akka-actor/src/main/resources/reference.conf +++ b/akka-actor/src/main/resources/reference.conf @@ -314,6 +314,7 @@ akka { # Entries for pluggable serializers and their bindings. serializers { java = "akka.serialization.JavaSerializer" + bytes = "akka.serialization.ByteArraySerializer" } # Class to Serializer binding. You only need to specify the name of an interface @@ -323,6 +324,7 @@ akka { # To disable one of the default serializers, assign its class to "none", like # "java.io.Serializable" = none serialization-bindings { + "[B" = bytes "java.io.Serializable" = java } diff --git a/akka-actor/src/main/scala/akka/actor/DynamicAccess.scala b/akka-actor/src/main/scala/akka/actor/DynamicAccess.scala index 2929032dc5..4370bba23b 100644 --- a/akka-actor/src/main/scala/akka/actor/DynamicAccess.scala +++ b/akka-actor/src/main/scala/akka/actor/DynamicAccess.scala @@ -65,7 +65,7 @@ class ReflectiveDynamicAccess(val classLoader: ClassLoader) extends DynamicAcces override def getClassFor[T: ClassTag](fqcn: String): Try[Class[_ <: T]] = Try[Class[_ <: T]]({ - val c = classLoader.loadClass(fqcn).asInstanceOf[Class[_ <: T]] + val c = Class.forName(fqcn, true, classLoader).asInstanceOf[Class[_ <: T]] val t = implicitly[ClassTag[T]].runtimeClass if (t.isAssignableFrom(c)) c else throw new ClassCastException(t + " is not assignable from " + c) }) diff --git a/akka-actor/src/main/scala/akka/serialization/Serializer.scala b/akka-actor/src/main/scala/akka/serialization/Serializer.scala index f6300ca998..5670ba61ba 100644 --- a/akka-actor/src/main/scala/akka/serialization/Serializer.scala +++ b/akka-actor/src/main/scala/akka/serialization/Serializer.scala @@ -133,3 +133,18 @@ class NullSerializer extends Serializer { def toBinary(o: AnyRef) = nullAsBytes def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = null } + +/** + * This is a special Serializer that Serializes and deserializes byte arrays only, + * (just returns the byte array unchanged/uncopied) + */ +class ByteArraySerializer extends Serializer { + def includeManifest: Boolean = false + def identifier = 4 + def toBinary(o: AnyRef) = o match { + case null ⇒ null + case o: Array[Byte] ⇒ o + case other ⇒ throw new IllegalArgumentException("ByteArraySerializer only serializes byte arrays, not [" + other + "]") + } + def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = bytes +}