Пользовательский сериализатор Джексона не работает в варианте сборки выпускаAndroid

Форум для тех, кто программирует под Android
Anonymous
Пользовательский сериализатор Джексона не работает в варианте сборки выпуска

Сообщение Anonymous »

У меня есть класс данных, в котором есть поле Uri:
data class MyDataClass(
@JsonSerialize(using = JacksonUriSerializer::class)
@JsonDeserialize(using = JacksonUriDeserializer::class)
@param:JsonProperty(value = "uri")
@get:JsonProperty(value = "uri")
val uri: Uri
)

И следующий пользовательский сериализатор/десериализатор:
import android.net.Uri
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.databind.JsonSerializer
import com.fasterxml.jackson.databind.SerializerProvider

class JacksonUriSerializer : JsonSerializer() {

override fun serialize(
value: Uri,
jsonGenerator: JsonGenerator,
serializerProvider: SerializerProvider?
) {
jsonGenerator.writeString(value.toString())
}
}

import android.net.Uri
import androidx.core.net.toUri
import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.DeserializationContext
import com.fasterxml.jackson.databind.JsonDeserializer

class JacksonUriDeserializer : JsonDeserializer() {

override fun deserialize(
jsonParser: JsonParser,
deserializationContext: DeserializationContext?
): Uri {
return jsonParser.valueAsString.toUri()
}
}

Сериализация/десериализация работает нормально, когда приложение работает в варианте отладочной сборки. Но когда я запускаю его в варианте сборки выпуска, выдается следующее исключение:
Document nesting depth (1001) exceeds the maximum allowed (1000, from `StreamWriteConstraints.getMaxNestingDepth()`) (through reference chain...
->android.net.Uri$StringUri["canonicalUri"]
->android.net.Uri$HierarchicalUri["canonicalUri"]
->android.net.Uri$HierarchicalUri["canonicalUri"]
->...

Я использую версию 2.17.2 Джексона, и мои текущие правила защиты для Джексона:
-dontwarn com.fasterxml.jackson.core.type.TypeReference
-keep class * extends com.fasterxml.jackson.core.type.TypeReference {
();
}


Примечание:

1 — я пытался добавить аннотацию @Keep в пользовательский сериализатор/десериализатор (это не дало эффекта)

2 - Я пытался добавить следующие правила proguard, но безрезультатно:
-keep class * extends com.fasterxml.jackson.databind.JsonSerializer { *; }
-keep class * extends com.fasterxml.jackson.databind.JsonDeserializer { *; }


Подробнее здесь: https://stackoverflow.com/questions/791 ... ld-variant

Вернуться в «Android»