mirror of
https://github.com/corda/corda.git
synced 2025-01-21 03:55:00 +00:00
When implementing a generic interface subtype check fails, need to compare to the actual raw type
This commit is contained in:
parent
8c5fe16211
commit
baf5c97e0c
@ -7,6 +7,10 @@ release, see :doc:`upgrade-notes`.
|
||||
Unreleased
|
||||
==========
|
||||
|
||||
* Fix CORDA-1403 where a property of a class that implemented a generic interface could not be deserialised in
|
||||
a factory without a serialiser as the subtype check for the class instance failed. Fix is to compare the raw
|
||||
type.
|
||||
|
||||
* Fix CORDA-1229. Setter-based serialization was broken with generic types when the property was stored
|
||||
as the raw type, List for example.
|
||||
|
||||
|
@ -471,10 +471,10 @@ internal fun Type.asParameterizedType(): ParameterizedType {
|
||||
}
|
||||
|
||||
internal fun Type.isSubClassOf(type: Type): Boolean {
|
||||
return TypeToken.of(this).isSubtypeOf(type)
|
||||
return TypeToken.of(this).isSubtypeOf(TypeToken.of(type).rawType)
|
||||
}
|
||||
|
||||
// ByteArrays, primtives and boxed primitives are not stored in the object history
|
||||
// ByteArrays, primitives 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)
|
||||
|
@ -1146,4 +1146,29 @@ class SerializationOutputTests {
|
||||
// The "test" is that this doesn't throw, anything else is a success
|
||||
PrivateAckWrapper.serialize()
|
||||
}
|
||||
|
||||
interface DataClassByInterface<V> {
|
||||
val v : V
|
||||
}
|
||||
|
||||
@Test
|
||||
fun dataClassBy() {
|
||||
data class C (val s: String) : DataClassByInterface<String> {
|
||||
override val v: String = "-- $s"
|
||||
}
|
||||
|
||||
data class Inner<T>(val wrapped: DataClassByInterface<T>) : DataClassByInterface<T> by wrapped {
|
||||
override val v = wrapped.v
|
||||
}
|
||||
|
||||
val i = Inner(C("hello"))
|
||||
|
||||
val bytes = SerializationOutput(testDefaultFactory()).serialize(i)
|
||||
|
||||
try {
|
||||
val i2 = DeserializationInput(testDefaultFactory()).deserialize(bytes)
|
||||
} catch (e : NotSerializableException) {
|
||||
throw Error ("Deserializing serialized \$C should not throw")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user