mirror of
https://github.com/corda/corda.git
synced 2025-02-21 09:51:57 +00:00
ENT-1463: Refactor serialisation slightly for determinisation. (#3110)
This commit is contained in:
parent
1a6922afe0
commit
36d13124d5
@ -10,9 +10,9 @@ import java.nio.ByteBuffer
|
|||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
|
||||||
internal val serializeOutputStreamPool = LazyPool(
|
internal val serializeOutputStreamPool = LazyPool(
|
||||||
clear = ByteBufferOutputStream::reset,
|
clear = ByteBufferOutputStream::reset,
|
||||||
shouldReturnToPool = { it.size() < 256 * 1024 }, // Discard if it grew too large
|
shouldReturnToPool = { it.size() < 256 * 1024 }, // Discard if it grew too large
|
||||||
newInstance = { ByteBufferOutputStream(64 * 1024) })
|
newInstance = { ByteBufferOutputStream(64 * 1024) })
|
||||||
|
|
||||||
internal fun <T> byteArrayOutput(task: (ByteBufferOutputStream) -> T): ByteArray {
|
internal fun <T> byteArrayOutput(task: (ByteBufferOutputStream) -> T): ByteArray {
|
||||||
return serializeOutputStreamPool.run { underlying ->
|
return serializeOutputStreamPool.run { underlying ->
|
||||||
|
@ -2,16 +2,11 @@
|
|||||||
|
|
||||||
package net.corda.nodeapi.internal.serialization
|
package net.corda.nodeapi.internal.serialization
|
||||||
|
|
||||||
import net.corda.core.serialization.ClassWhitelist
|
|
||||||
import net.corda.core.serialization.SerializationContext
|
import net.corda.core.serialization.SerializationContext
|
||||||
import net.corda.core.serialization.SerializationDefaults
|
import net.corda.core.serialization.SerializationDefaults
|
||||||
import net.corda.nodeapi.internal.serialization.amqp.amqpMagic
|
import net.corda.nodeapi.internal.serialization.amqp.amqpMagic
|
||||||
import net.corda.nodeapi.internal.serialization.kryo.kryoMagic
|
import net.corda.nodeapi.internal.serialization.kryo.kryoMagic
|
||||||
|
|
||||||
object QuasarWhitelist : ClassWhitelist {
|
|
||||||
override fun hasListed(type: Class<*>): Boolean = true
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Serialisation contexts for the server.
|
* Serialisation contexts for the server.
|
||||||
* These have been refactored into a separate file to prevent
|
* These have been refactored into a separate file to prevent
|
||||||
|
@ -2,10 +2,7 @@
|
|||||||
|
|
||||||
package net.corda.nodeapi.internal.serialization
|
package net.corda.nodeapi.internal.serialization
|
||||||
|
|
||||||
import net.corda.core.serialization.EncodingWhitelist
|
import net.corda.core.serialization.*
|
||||||
import net.corda.core.serialization.SerializationContext
|
|
||||||
import net.corda.core.serialization.SerializationDefaults
|
|
||||||
import net.corda.core.serialization.SerializationEncoding
|
|
||||||
import net.corda.nodeapi.internal.serialization.amqp.amqpMagic
|
import net.corda.nodeapi.internal.serialization.amqp.amqpMagic
|
||||||
import net.corda.nodeapi.internal.serialization.kryo.kryoMagic
|
import net.corda.nodeapi.internal.serialization.kryo.kryoMagic
|
||||||
|
|
||||||
@ -36,3 +33,7 @@ val AMQP_P2P_CONTEXT = SerializationContextImpl(amqpMagic,
|
|||||||
internal object AlwaysAcceptEncodingWhitelist : EncodingWhitelist {
|
internal object AlwaysAcceptEncodingWhitelist : EncodingWhitelist {
|
||||||
override fun acceptEncoding(encoding: SerializationEncoding) = true
|
override fun acceptEncoding(encoding: SerializationEncoding) = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object QuasarWhitelist : ClassWhitelist {
|
||||||
|
override fun hasListed(type: Class<*>): Boolean = true
|
||||||
|
}
|
||||||
|
@ -95,11 +95,11 @@ abstract class AbstractAMQPSerializationScheme(
|
|||||||
register(net.corda.nodeapi.internal.serialization.amqp.custom.X509CRLSerializer)
|
register(net.corda.nodeapi.internal.serialization.amqp.custom.X509CRLSerializer)
|
||||||
register(net.corda.nodeapi.internal.serialization.amqp.custom.CertPathSerializer(this))
|
register(net.corda.nodeapi.internal.serialization.amqp.custom.CertPathSerializer(this))
|
||||||
register(net.corda.nodeapi.internal.serialization.amqp.custom.StringBufferSerializer)
|
register(net.corda.nodeapi.internal.serialization.amqp.custom.StringBufferSerializer)
|
||||||
register(net.corda.nodeapi.internal.serialization.amqp.custom.SimpleStringSerializer)
|
|
||||||
register(net.corda.nodeapi.internal.serialization.amqp.custom.InputStreamSerializer)
|
register(net.corda.nodeapi.internal.serialization.amqp.custom.InputStreamSerializer)
|
||||||
register(net.corda.nodeapi.internal.serialization.amqp.custom.BitSetSerializer(this))
|
register(net.corda.nodeapi.internal.serialization.amqp.custom.BitSetSerializer(this))
|
||||||
register(net.corda.nodeapi.internal.serialization.amqp.custom.EnumSetSerializer(this))
|
register(net.corda.nodeapi.internal.serialization.amqp.custom.EnumSetSerializer(this))
|
||||||
register(net.corda.nodeapi.internal.serialization.amqp.custom.ContractAttachmentSerializer(this))
|
register(net.corda.nodeapi.internal.serialization.amqp.custom.ContractAttachmentSerializer(this))
|
||||||
|
registerNonDeterministicSerializers(factory)
|
||||||
}
|
}
|
||||||
for (whitelistProvider in serializationWhitelists) {
|
for (whitelistProvider in serializationWhitelists) {
|
||||||
factory.addToWhitelist(*whitelistProvider.whitelist.toTypedArray())
|
factory.addToWhitelist(*whitelistProvider.whitelist.toTypedArray())
|
||||||
@ -116,7 +116,15 @@ abstract class AbstractAMQPSerializationScheme(
|
|||||||
factory.registerExternal(CorDappCustomSerializer(customSerializer, factory))
|
factory.registerExternal(CorDappCustomSerializer(customSerializer, factory))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Register the serializers which will be excluded from the DJVM.
|
||||||
|
*/
|
||||||
|
private fun registerNonDeterministicSerializers(factory: SerializerFactory) {
|
||||||
|
with(factory) {
|
||||||
|
register(net.corda.nodeapi.internal.serialization.amqp.custom.SimpleStringSerializer)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val serializerFactoriesForContexts = ConcurrentHashMap<Pair<ClassWhitelist, ClassLoader>, SerializerFactory>()
|
private val serializerFactoriesForContexts = ConcurrentHashMap<Pair<ClassWhitelist, ClassLoader>, SerializerFactory>()
|
||||||
|
@ -89,8 +89,9 @@ private val toStringHelper: String = Type.getInternalName(MoreObjects.ToStringHe
|
|||||||
*
|
*
|
||||||
* Equals/hashCode methods are not yet supported.
|
* Equals/hashCode methods are not yet supported.
|
||||||
*/
|
*/
|
||||||
class ClassCarpenter(cl: ClassLoader = Thread.currentThread().contextClassLoader,
|
class ClassCarpenter(cl: ClassLoader, val whitelist: ClassWhitelist) {
|
||||||
val whitelist: ClassWhitelist) {
|
constructor(whitelist: ClassWhitelist) : this(Thread.currentThread().contextClassLoader, whitelist)
|
||||||
|
|
||||||
// TODO: Generics.
|
// TODO: Generics.
|
||||||
// TODO: Sandbox the generated code when a security manager is in use.
|
// TODO: Sandbox the generated code when a security manager is in use.
|
||||||
// TODO: Generate equals/hashCode.
|
// TODO: Generate equals/hashCode.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user