https://kotlinlang.org logo
#serialization
Title
# serialization
b

bartvh

11/30/2018, 2:08 PM
I'm trying to get a long field to encode as a string instead of as a number in JSON (for values that overflow double):
Copy code
@Serializer(forClass = Long::class)
object LongStrSerializer : KSerializer<Long> {
    override fun deserialize(input: Decoder): Long =
            input.decodeString().toLong()

    override fun serialize(output: Encoder, obj: Long) =
            output.encodeString(obj.toString())
}

@kotlinx.serialization.Serializable
data class PlayerSummary(
        @kotlinx.serialization.Serializable(with = LongStrSerializer::class)
        val id: Long,
        val displayName: String
)
However this still results in:
Copy code
{
  "displayName": "Jessie James",
  "id": 1337000000
}
What am I doing wrong?
Inspecting the compiled code gives me
Copy code
public void write$Self(@NotNull CompositeEncoder output, @NotNull SerialDescriptor serialDesc) {
      Intrinsics.checkParameterIsNotNull(output, "output");
      Intrinsics.checkParameterIsNotNull(serialDesc, "serialDesc");
      output.encodeLongElement(serialDesc, 0, this.id);
      output.encodeStringElement(serialDesc, 1, this.displayName);
   }
which is consistent with this result
s

sandwwraith

11/30/2018, 3:48 PM
It is a known issue that properties with primitive types ignore serializers override (https://github.com/Kotlin/kotlinx.serialization/issues/252#issuecomment-440325053). It was fixed in the plugin and will be in the next release.
😁 1
4 Views