October 23, 2024
Chicago 12, Melborne City, USA
Android

Jackson custom serializer not working in release build variant


I have a data class that has an Uri field in it:

data class MyDataClass(
    @JsonSerialize(using = JacksonUriSerializer::class)
    @JsonDeserialize(using = JacksonUriDeserializer::class)
    @param:JsonProperty(value = "uri")
    @get:JsonProperty(value = "uri")
    val uri: Uri
)

And the following custom serializer/deserializer:

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<Uri>() {

    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<Uri>() {

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

The serialization/deserialization works fine when the app is running on debug build variant. But when I run it on release build variant, the following exception is thrown:

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"]
->...

I’m using the version 2.17.2 of Jackson and my current proguard rules for jackson are:

-dontwarn com.fasterxml.jackson.core.type.TypeReference
-keep class * extends com.fasterxml.jackson.core.type.TypeReference {
   <init>();
}

Obs.:
1 – I tried to add the @Keep annotation to the custom serializer/deserializer (it had not effect)
2 – I tried to add the following proguard rules, with not effect:

-keep class * extends com.fasterxml.jackson.databind.JsonSerializer { *; }
-keep class * extends com.fasterxml.jackson.databind.JsonDeserializer { *; }



You need to sign in to view this answers

Leave feedback about this

  • Quality
  • Price
  • Service

PROS

+
Add Field

CONS

+
Add Field
Choose Image
Choose Video