Skip to content

Commit 7493f7d

Browse files
authored
Merge pull request #634 from k163377/fix-#295
Fix ReflectionCache to be serializable
2 parents 0f981bb + c6ee34c commit 7493f7d

File tree

4 files changed

+89
-1
lines changed

4 files changed

+89
-1
lines changed

src/main/kotlin/com/fasterxml/jackson/module/kotlin/ReflectionCache.kt

+7-1
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,19 @@ import com.fasterxml.jackson.databind.introspect.AnnotatedMember
55
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod
66
import com.fasterxml.jackson.databind.introspect.AnnotatedWithParams
77
import com.fasterxml.jackson.databind.util.LRUMap
8+
import java.io.Serializable
89
import java.lang.reflect.Constructor
910
import java.lang.reflect.Executable
1011
import java.lang.reflect.Method
1112
import kotlin.reflect.KFunction
1213
import kotlin.reflect.jvm.kotlinFunction
1314

14-
internal class ReflectionCache(reflectionCacheSize: Int) {
15+
internal class ReflectionCache(reflectionCacheSize: Int) : Serializable {
16+
companion object {
17+
// Increment is required when properties that use LRUMap are changed.
18+
private const val serialVersionUID = 1L
19+
}
20+
1521
sealed class BooleanTriState(val value: Boolean?) {
1622
class True : BooleanTriState(true)
1723
class False : BooleanTriState(false)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.fasterxml.jackson.module.kotlin
2+
3+
import junit.framework.TestCase
4+
import java.io.ByteArrayInputStream
5+
import java.io.ByteArrayOutputStream
6+
import java.io.ObjectInputStream
7+
import java.io.ObjectOutputStream
8+
9+
fun jdkSerialize(o: Any): ByteArray {
10+
val bytes = ByteArrayOutputStream(1000)
11+
val obOut = ObjectOutputStream(bytes)
12+
obOut.writeObject(o)
13+
obOut.close()
14+
return bytes.toByteArray()
15+
}
16+
17+
fun <T> jdkDeserialize(raw: ByteArray): T? {
18+
val objIn = ObjectInputStream(ByteArrayInputStream(raw))
19+
return try {
20+
@Suppress("UNCHECKED_CAST")
21+
objIn.readObject() as T
22+
} catch (e: ClassNotFoundException) {
23+
TestCase.fail("Missing class: " + e.message)
24+
null
25+
} finally {
26+
objIn.close()
27+
}
28+
}

src/test/kotlin/com/fasterxml/jackson/module/kotlin/KotlinModuleTest.kt

+24
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import org.junit.Assert.assertEquals
1111
import org.junit.Assert.assertFalse
1212
import org.junit.Assert.assertTrue
1313
import org.junit.Test
14+
import kotlin.test.assertNotNull
1415

1516
class KotlinModuleTest {
1617
/**
@@ -103,4 +104,27 @@ class KotlinModuleTest {
103104

104105
assertTrue(module.strictNullChecks)
105106
}
107+
108+
@Test
109+
fun jdkSerializabilityTest() {
110+
val module = KotlinModule.Builder().apply {
111+
withReflectionCacheSize(123)
112+
enable(NullToEmptyCollection)
113+
enable(NullToEmptyMap)
114+
enable(NullIsSameAsDefault)
115+
enable(SingletonSupport)
116+
enable(StrictNullChecks)
117+
}.build()
118+
119+
val serialized = jdkSerialize(module)
120+
val deserialized = jdkDeserialize<KotlinModule>(serialized)
121+
122+
assertNotNull(deserialized)
123+
assertEquals(123, deserialized.reflectionCacheSize)
124+
assertTrue(deserialized.nullToEmptyCollection)
125+
assertTrue(deserialized.nullToEmptyMap)
126+
assertTrue(deserialized.nullIsSameAsDefault)
127+
assertEquals(CANONICALIZE, deserialized.singletonSupport)
128+
assertTrue(deserialized.strictNullChecks)
129+
}
106130
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.fasterxml.jackson.module.kotlin
2+
3+
import org.junit.Test
4+
import kotlin.test.assertNotNull
5+
6+
class ReflectionCacheTest {
7+
@Test
8+
fun serializeEmptyCache() {
9+
val cache = ReflectionCache(100)
10+
val serialized = jdkSerialize(cache)
11+
val deserialized = jdkDeserialize<ReflectionCache>(serialized)
12+
13+
assertNotNull(deserialized)
14+
// Deserialized instance also do not raise exceptions
15+
deserialized.kotlinFromJava(ReflectionCacheTest::class.java.getDeclaredMethod("serializeEmptyCache"))
16+
}
17+
18+
@Test
19+
fun serializeNotEmptyCache() {
20+
val method = ReflectionCacheTest::class.java.getDeclaredMethod("serializeNotEmptyCache")
21+
22+
val cache = ReflectionCache(100).apply { kotlinFromJava(method) }
23+
val serialized = jdkSerialize(cache)
24+
val deserialized = jdkDeserialize<ReflectionCache>(serialized)
25+
26+
assertNotNull(deserialized)
27+
// Deserialized instance also do not raise exceptions
28+
deserialized.kotlinFromJava(method)
29+
}
30+
}

0 commit comments

Comments
 (0)