From 15e4449b38b5e8ecd0ef224baa842d631a5c0a53 Mon Sep 17 00:00:00 2001 From: Michal Kit Date: Thu, 15 Mar 2018 10:11:01 +0000 Subject: [PATCH] Adding BigInteger serialization support (#2804) * Adding BigInteger serialization support * Addressing review comments --- docs/source/changelog.rst | 4 ++++ .../amqp/AMQPSerializationScheme.kt | 1 + .../amqp/custom/BigIntegerSerializer.kt | 11 +++++++++++ .../amqp/SerializationOutputTests.kt | 16 ++++++++++++++++ 4 files changed, 32 insertions(+) create mode 100644 node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/BigIntegerSerializer.kt diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index 7626d7d312..a7a24e834e 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -13,6 +13,10 @@ from the previous milestone release. * Introduced a placeholder for custom properties within ``node.conf``; the property key is "custom". +* java.math.BigInteger serialization support added. + +* java.security.cert.CRLReason added to the default Whitelist. + .. _changelog_v3: Version 3.0 diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializationScheme.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializationScheme.kt index f099ce7af5..b56cbea372 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializationScheme.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/AMQPSerializationScheme.kt @@ -53,6 +53,7 @@ abstract class AbstractAMQPSerializationScheme(val cordappLoader: List) register(net.corda.nodeapi.internal.serialization.amqp.custom.PrivateKeySerializer) register(net.corda.nodeapi.internal.serialization.amqp.custom.ThrowableSerializer(this)) register(net.corda.nodeapi.internal.serialization.amqp.custom.BigDecimalSerializer) + register(net.corda.nodeapi.internal.serialization.amqp.custom.BigIntegerSerializer) register(net.corda.nodeapi.internal.serialization.amqp.custom.CurrencySerializer) register(net.corda.nodeapi.internal.serialization.amqp.custom.OpaqueBytesSubSequenceSerializer(this)) register(net.corda.nodeapi.internal.serialization.amqp.custom.InstantSerializer(this)) diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/BigIntegerSerializer.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/BigIntegerSerializer.kt new file mode 100644 index 0000000000..268676c312 --- /dev/null +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/serialization/amqp/custom/BigIntegerSerializer.kt @@ -0,0 +1,11 @@ +package net.corda.nodeapi.internal.serialization.amqp.custom + +import net.corda.nodeapi.internal.serialization.amqp.CustomSerializer +import java.math.BigInteger + +/** + * A serializer for [BigInteger], utilising the string based helper. [BigInteger] seems to have no import/export + * features that are precision independent other than via a string. The format of the string is discussed in the + * documentation for [BigInteger.toString]. + */ +object BigIntegerSerializer : CustomSerializer.ToString(BigInteger::class.java) \ No newline at end of file diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt index 5fc4359e88..bf081d04ad 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/serialization/amqp/SerializationOutputTests.kt @@ -40,6 +40,7 @@ import java.io.ByteArrayInputStream import java.io.IOException import java.io.NotSerializableException import java.math.BigDecimal +import java.math.BigInteger import java.time.* import java.time.temporal.ChronoUnit import java.util.* @@ -976,6 +977,21 @@ class SerializationOutputTests(private val compression: CordaSerializationEncodi assertEquals(objCopy.a, objCopy.b) } + data class BigIntegers(val a: BigInteger, val b: BigInteger) + + @Test + fun `test BigInteger custom serializer`() { + val factory = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) + factory.register(net.corda.nodeapi.internal.serialization.amqp.custom.BigIntegerSerializer) + + val factory2 = SerializerFactory(AllWhitelist, ClassLoader.getSystemClassLoader()) + factory2.register(net.corda.nodeapi.internal.serialization.amqp.custom.BigIntegerSerializer) + + val obj = BigIntegers(BigInteger.TEN, BigInteger.TEN) + val objCopy = serdes(obj, factory, factory2) + assertEquals(objCopy.a, objCopy.b) + } + data class ByteArrays(val a: ByteArray, val b: ByteArray) @Test