diff --git a/src/dorkbox/network/Client.kt b/src/dorkbox/network/Client.kt index a7294a25..428c195a 100644 --- a/src/dorkbox/network/Client.kt +++ b/src/dorkbox/network/Client.kt @@ -385,7 +385,7 @@ open class Client(config: Configuration = Configuration /////////////// // we setup our kryo information once we connect to a server (using the server's kryo registration details) - if (!serialization.finishInit(type, settingsStore, connectionInfo.kryoRegistrationDetails)) { + if (!serialization.finishInit(type, connectionInfo.kryoRegistrationDetails)) { handshakeConnection.close() // because we are getting the class registration details from the SERVER, this should never be the case. diff --git a/src/dorkbox/network/Server.kt b/src/dorkbox/network/Server.kt index 7748477e..69f4ca10 100644 --- a/src/dorkbox/network/Server.kt +++ b/src/dorkbox/network/Server.kt @@ -143,7 +143,7 @@ open class Server(config: ServerConfiguration = ServerC } // we are done with initial configuration, now finish serialization - serialization.finishInit(type, settingsStore, ByteArray(0)) + serialization.finishInit(type, ByteArray(0)) } override fun newException(message: String, cause: Throwable?): Throwable { diff --git a/src/dorkbox/network/storage/Inet4AddressIpSerializer.kt b/src/dorkbox/network/storage/Inet4AddressIpSerializer.kt new file mode 100644 index 00000000..4535eddb --- /dev/null +++ b/src/dorkbox/network/storage/Inet4AddressIpSerializer.kt @@ -0,0 +1,23 @@ +package dorkbox.network.storage + +import com.esotericsoftware.kryo.Kryo +import com.esotericsoftware.kryo.Serializer +import com.esotericsoftware.kryo.io.Input +import com.esotericsoftware.kryo.io.Output +import java.net.Inet4Address +import java.net.InetAddress + +// NOTE: This only serializes the IP address, not the hostname! +class Inet4AddressIpSerializer : Serializer() { + init { + isImmutable = true + } + + override fun write(kryo: Kryo, output: Output, `object`: Inet4Address) { + output.write(`object`.address, 0, 4) + } + + override fun read(kryo: Kryo, input: Input, type: Class): Inet4Address { + return InetAddress.getByAddress("", input.readBytes(4)) as Inet4Address + } +} diff --git a/src/dorkbox/network/storage/Inet6AddressIpSerializer.kt b/src/dorkbox/network/storage/Inet6AddressIpSerializer.kt new file mode 100644 index 00000000..0720a2a3 --- /dev/null +++ b/src/dorkbox/network/storage/Inet6AddressIpSerializer.kt @@ -0,0 +1,29 @@ +package dorkbox.network.storage + +import com.esotericsoftware.kryo.Kryo +import com.esotericsoftware.kryo.KryoException +import com.esotericsoftware.kryo.Serializer +import com.esotericsoftware.kryo.io.Input +import com.esotericsoftware.kryo.io.Output +import java.net.Inet6Address +import java.net.InetAddress +import java.net.UnknownHostException + +// NOTE: This only serializes the IP address, not the hostname! +class Inet6AddressIpSerializer : Serializer() { + init { + isImmutable = true + } + + override fun write(kryo: Kryo, output: Output, `object`: Inet6Address) { + output.write(`object`.address, 0, 16) + } + + override fun read(kryo: Kryo, input: Input, type: Class): Inet6Address { + return try { + InetAddress.getByAddress("", input.readBytes(16)) as Inet6Address + } catch (e: UnknownHostException) { + throw KryoException(e) + } + } +} diff --git a/src/dorkbox/network/storage/SettingsStore.kt b/src/dorkbox/network/storage/SettingsStore.kt index 8bb529ab..46d98444 100644 --- a/src/dorkbox/network/storage/SettingsStore.kt +++ b/src/dorkbox/network/storage/SettingsStore.kt @@ -15,6 +15,7 @@ */ package dorkbox.network.storage +import com.esotericsoftware.kryo.serializers.MapSerializer import dorkbox.netUtil.IPv4 import dorkbox.netUtil.IPv6 import dorkbox.network.connection.CryptoManagement @@ -22,8 +23,11 @@ import dorkbox.util.bytes.ByteArrayWrapper import dorkbox.util.exceptions.SecurityException import dorkbox.util.storage.Storage import dorkbox.util.storage.StorageBuilder +import dorkbox.util.storage.StorageSystem import org.agrona.collections.Object2NullableObjectHashMap import org.slf4j.LoggerFactory +import java.net.Inet4Address +import java.net.Inet6Address import java.net.InetAddress import java.security.SecureRandom @@ -48,6 +52,18 @@ open class SettingsStore(internal val builder: StorageBuilder) : AutoCloseable { * Initialize using the provided serialization manager. */ fun init() { + if (builder is StorageSystem.DiskBuilder) { + // NOTE: there are problems if our serializer is THE SAME serializer used by the network stack! + // make sure our custom types are registered! + builder.serializationManager.register(Object2NullableObjectHashMap::class.java, MapSerializer()) + builder.serializationManager.register(ByteArrayWrapper::class.java) + builder.serializationManager.register(DB_Server::class.java) + + // NOTE: These only serialize the IP address, not the hostname! + builder.serializationManager.register(Inet4Address::class.java, Inet4AddressIpSerializer()) + builder.serializationManager.register(Inet6Address::class.java, Inet6AddressIpSerializer()) + } + this.storage = builder.build() servers = this.storage.get(DB_Server.STORAGE_KEY, Object2NullableObjectHashMap())