Safely Navigating the Transition: From Gson to kotlinx.serialization | via Mahmoud Afarideh | Dec, 2023

Leveraging IDE Gear

To make lifestyles more uncomplicated, I dived into the arsenal of IDE equipment in Android Studio. The usage of regex and In finding/Substitute, I seamlessly built-in kotlinx.serialization annotations along Gson annotations.🧰

In finding/Substitute the usage of regex
// Earlier than
@SerializedName("field_name")
val fieldName: String

// After
@SerializedName("field_name")
@SerialName("field_name")
val fieldName: String

Function Flags for Protected Merging

Picture via Jaye Haych on Unsplash

Making sure a clean merging of adjustments into the principle department, I used characteristic flags. Take a look at extra about characteristic flags right here. This allowed for a gentle creation of kotlinx.serialization whilst retaining Gson as the principle serializer till I used to be certain the transition was once a luck.🚩

if (useKtxSerialization) {
// Use kotlinx.serialization
} else {
// Use Gson
}

Blended Converter for Retrofit

Picture via Vardan Papikyan on Unsplash

Imposing a mixed converter for Retrofit was once a game-changer. This converter supported each Gson and kotlinx.serialization, making the incremental migration of endpoints a breeze whilst retaining our app strong.🚗💨

// Retrofit setup with mixed converter
val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(
CombinedConverterFactory(
KotlinxSerializationConverterFactory.create(),
GsonConverterFactory.create()
)
)
.construct()

Polymorphic serialization in kotlinx.serialization is a breeze. Let’s say now we have a hierarchy of shapes:

@Serializable
@Polymorphic
sealed elegance Form

@Serializable
@SerialName("CircleType")
information elegance Circle(val radius: Double) : Form()

@Serializable
@SerialName("SquareType")
information elegance Sq.(val sideLength: Double) : Form()

Now, when serializing an inventory of shapes:

val shapes: Checklist<Form> = listOf(Circle(5.0), Sq.(4.0))
val json = Json.encodeToString(shapes)

// JSON
[
{"type":"CircleType","radius":5.0},
{"type":"SquareType","sideLength":4.0}
]

To take on demanding situations with customized serializers and polymorphics, I went all out with complete assessments for complicated serializable items. This proactive method, helped me catch problems early within the migration procedure.🧪

    non-public val jsonString = """         
{
"some_object": {
"sort": "SOME_TYPE",
"payload" : {
"some_key": "some_value"
}
}
}""".trimIndent()

// Instance check for complicated serializable object
@Check
amusing testComplexObjectSerialization() {
// Check common sense the usage of kotlinx.serialization
// Assert statements
val someObject = json.decodeFromString<SomeClass>(jsonString)
assertEquals(
expectedModel, someObject
)
}

Picture via Diana Polekhina on Unsplash

To stay our app crusing easily, I presented Gson as a fallback for kotlinx.serialization. This twin reinforce allowed me to expectantly navigate surprising demanding situations all through the migration.⚓️

// Fallback common sense in case kotlinx.serialization fails
take a look at {
// Use kotlinx.serialization
} catch (e: SerializationException) {
// Observe exception
// Fallback to Gson
}

To make sure steadiness incrementally, I enlisted tracking equipment to trace problems bobbing up from kotlinx.serialization utilization. This proactive method helped us establish and unravel demanding situations as they surfaced.🔍📈

Picture via Luke Chesser on Unsplash

Leave a Comment

Your email address will not be published. Required fields are marked *