@@ -12,14 +12,32 @@ import kotlin.reflect.jvm.jvmErasure
1212 * @author [Ivan Ivanov](https://vk.com/irisism)
1313 */
1414
15- object DeserializerCache {
15+ object DeserializerFactory {
1616 private val cache = mutableMapOf<KClass <* >, Deserializer > ()
1717 private val typeCache = mutableMapOf<KType , Deserializer >()
1818
1919 fun getDeserializer (d : KClass <* >): Deserializer {
2020 return cache.getOrPut(d) { buildInstance(d) }
2121 }
2222
23+ fun registerDeserializer (d : KClass <* >, deserializer : Deserializer , force : Boolean = false) {
24+ cache[d] = deserializer
25+ val supers = d.superclasses
26+ if (supers.isEmpty())
27+ return
28+ val lastDes = if (force) null else cache[supers.last()]
29+ if (lastDes == null ) {
30+ for (c in supers)
31+ cache[c] = deserializer
32+ } else {
33+ for (c in supers) {
34+ if (cache.contains(c))
35+ break
36+ cache[c] = deserializer
37+ }
38+ }
39+ }
40+
2341 fun getDeserializer (type : KType ): Deserializer {
2442 return typeCache.getOrPut(type) {
2543 DeserializerPrimitiveImpl .convertType(type, null )
@@ -43,7 +61,7 @@ object DeserializerCache {
4361 private fun getMapType (type : KType ): KType {
4462 val (key, value) = type.arguments
4563 if (! key.type!! .isSubtypeOf(CharSequence ::class .starProjectedType))
46- throw IllegalStateException (" Map key cannot be not CharSequence inherited" )
64+ throw IllegalStateException (" Map key cannot be non CharSequence inherited" )
4765 return value.type!!
4866 }
4967
0 commit comments