From f0b2b0a566aff2f1ed30097f702c1c522a1ca0b7 Mon Sep 17 00:00:00 2001 From: Rick Parker Date: Mon, 4 Sep 2017 11:23:13 +0100 Subject: [PATCH] Change the condition for what is stored in AMQP object history for object reference logic (#1404) --- .../internal/serialization/amqp/DeserializationInput.kt | 2 +- .../internal/serialization/amqp/SerializationHelper.kt | 8 ++++++-- .../internal/serialization/amqp/SerializationOutput.kt | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt index a8d3a94d2f..d5668cc494 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/DeserializationInput.kt @@ -142,7 +142,7 @@ class DeserializationInput(internal val serializerFactory: SerializerFactory) { } // Store the reference in case we need it later on. // Skip for primitive types as they are too small and overhead of referencing them will be much higher than their content - if (suitableForObjectReference(type)) objectHistory.add(objectRead) + if (suitableForObjectReference(objectRead.javaClass)) objectHistory.add(objectRead) objectRead } diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt index 2a5fe70f2c..53a8ddf18e 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationHelper.kt @@ -1,5 +1,6 @@ package net.corda.nodeapi.internal.serialization.amqp +import com.google.common.primitives.Primitives import com.google.common.reflect.TypeToken import org.apache.qpid.proton.codec.Data import java.beans.IndexedPropertyDescriptor @@ -221,5 +222,8 @@ internal fun Type.isSubClassOf(type: Type): Boolean { return TypeToken.of(this).isSubtypeOf(type) } -internal fun suitableForObjectReference(type: Type) = - type != ByteArray::class.java && type.asClass()?.isPrimitive != true \ No newline at end of file +// ByteArrays, primtives and boxed primitives are not stored in the object history +internal fun suitableForObjectReference(type: Type): Boolean { + val clazz = type.asClass() + return type != ByteArray::class.java && (clazz != null && !clazz.isPrimitive && !Primitives.unwrap(clazz).isPrimitive) +} \ No newline at end of file diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt index 7246b4fb34..5379b5ab84 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutput.kt @@ -87,7 +87,7 @@ open class SerializationOutput(internal val serializerFactory: SerializerFactory // Important to do it after serialization such that dependent object will have preceding reference numbers // assigned to them first as they will be first read from the stream on receiving end. // Skip for primitive types as they are too small and overhead of referencing them will be much higher than their content - if (suitableForObjectReference(type)) objectHistory.put(obj, objectHistory.size) + if (suitableForObjectReference(obj.javaClass)) objectHistory.put(obj, objectHistory.size) } else { data.writeReferencedObject(ReferencedObject(retrievedRefCount))