diesieben07
10/13/2020, 4:09 PMEncoder#encodeSerializableValue
and act accordingly?Stylianos Gakis
10/13/2020, 9:34 PMaleksey.tomin
10/14/2020, 1:12 PM@Serializable
class Holder<T> (val value: T)
@Serializable
class StringHolderDirect (val value: String)
The both work with Json directly
Json.encodeToString(StringHolderDirect(""))
Json.encodeToString(Holder(""))}
but with ktor works only the second, the first produces an error:
val client = HttpClient(CIO) {
this.install(JsonFeature) { serializer = KotlinxSerializer() }
}
<http://client.post|client.post><String>(URL) {
contentType(ContentType.Application.Json)
body = Holder("")
}
On run:
Exception in thread "main" kotlinx.serialization.SerializationException: Serializer for class 'Holder' is not found.
Mark the class as @Serializable or provide the serializer explicitly.
at kotlinx.serialization.internal.Platform_commonKt.serializerNotRegistered(Platform.common.kt:91)
at kotlinx.serialization.SerializersKt__SerializersKt.serializer(Serializers.kt:130)
at kotlinx.serialization.SerializersKt.serializer(Unknown Source)
at io.ktor.client.features.json.serializer.KotlinxSerializerKt.buildSerializer(KotlinxSerializer.kt:77)
What do I wrong?aarjav
10/14/2020, 2:00 PMdata class Node<T: Any>(val id: String, val type: String, val value: T)
, is it possible to deserialize value
based on the type
field?Tomas Kormanak
10/14/2020, 2:16 PM@Serializable
data class (
val prop1:String
val prop2:dynamic
)
and JSON:
{
"prop1": "somestring",
"prop2": {
"a": 1,
"b": 2
}
}
Olaf Gottschalk
10/14/2020, 2:57 PM@JsonRawValue
for a string that already IS a valid Json string that needs to be put into the encoded result without any intervention, no escaping, nothing - and secondly I always work on unknown structures using Map<String, Any?>
as my data values. How can kotlinx-serialization do these two things?Big Chungus
10/15/2020, 2:57 PMGson().fromJson(<str>, <any java class>.class)
jaqxues
10/15/2020, 6:38 PM@OptIn(InternalSerializationApi::class)
fun main() {
val pairJson = """
{
"first": "a",
"second": 0
}
""".trimIndent()
println(Json.decodeFromString(serializer<Pair<String, Int>>(), pairJson))
println(Json.decodeFromString(serializer(object : TypeToken<Pair<String, Int>>() {}.type), pairJson))
}
As you can see, when using reified types, it works just fine, but as soon as i try to use type: kotlinx.serialization.SerializationException: Serializer for class 'Pair' is not found.
Now, I know that TypeToken is a class and weird type generic stuff from Gson, so I am not necessarily asking for a fix.
I just do not know what would be the best way to handle this problem. I suppose implementing the full kotlin reflection library and using createType
to create generic KTypes?
The type has to be stored in a property, so imagine a Data
container that needs the type
class Data {
// Allow KClass for simpler JsonElements to be deserialized
val type: Either<KClass<*>, KType<*>>
fun deserialize() { ... }
}
manlan
10/16/2020, 9:34 AMMark the class as @Serializable or provide the serializer explicitly.
I know UUID is not serializable.
How do I do provide a serializer in Ktor?KamilH
10/16/2020, 9:55 AMe: Compilation failed: Deserializer for declaration public kotlinx.serialization/UpdateMode|null[0] is not found
when running compileKotlinIos
task?
I’m using kotlinx-serialization-core:1.0.0
on 1.0.0-RC2
it was working properlyKamilH
10/16/2020, 10:06 AMktor 1.4.1
and serialization 1.0.0
. When I’m building and publishing it is works fine, but when I’m trying to use it in another project I’m getting a lot of “duplication” errors:
Duplicate class kotlinx.serialization.BinaryFormat found in modules jetified-kotlinx-serialization-core-jvm-1.0.0.jar (org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.0.0) and jetified-kotlinx-serialization-runtime-0.20.0.jar (org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0)
I found some message that suggest to exclude it in a following way:
implementation(io.ktor:ktor-client-serialization:1.4.1) {
exclude(group = "org.jetbrains.kotlinx", module = "kotlinx-serialization-runtime")
}
but it doesn’t helpBig Chungus
10/17/2020, 12:34 AMkartik1712
10/18/2020, 7:34 AMe: java.lang.IllegalStateException: Cannot get FQ name of local class: class <no name provided> : at.yawk.javap.model.ConfigProperty.Choice<kotlin.String?> defined in private final val propertyLanguageVersion: <no name provided> defined in at.yawk.javap.model.ConfigProperties
at org.jetbrains.kotlin.serialization.DescriptorAwareStringTable$DefaultImpls.getFqNameIndex(DescriptorAwareStringTable.kt:26)
at org.jetbrains.kotlin.serialization.StringTableImpl.getFqNameIndex(StringTableImpl.kt:25)
at org.jetbrains.kotlin.serialization.DescriptorSerializer.getClassifierId(DescriptorSerializer.kt:729)
at org.jetbrains.kotlin.serialization.DescriptorSerializer.fillFromPossiblyInnerType(DescriptorSerializer.kt:601)
at org.jetbrains.kotlin.serialization.DescriptorSerializer.type$serialization(DescriptorSerializer.kt:568)
at org.jetbrains.kotlin.serialization.DescriptorSerializer.typeId(DescriptorSerializer.kt:535)
at org.jetbrains.kotlin.serialization.DescriptorSerializer.propertyProto(DescriptorSerializer.kt:252)
at org.jetbrains.kotlin.serialization.DescriptorSerializer.classProto(DescriptorSerializer.kt:113)
at org.jetbrains.kotlin.cli.metadata.MetadataSerializer$PackageSerializer.serializeClasses(MetadataSerializer.kt:149)
at org.jetbrains.kotlin.cli.metadata.MetadataSerializer$PackageSerializer.run(MetadataSerializer.kt:133)
at org.jetbrains.kotlin.cli.metadata.MetadataSerializer$performSerialization$1.visitClassOrObject(MetadataSerializer.kt:86)
at org.jetbrains.kotlin.psi.KtVisitorVoid.visitClassOrObject(KtVisitorVoid.java:465)
at org.jetbrains.kotlin.psi.KtVisitorVoid.visitClassOrObject(KtVisitorVoid.java:21)
at org.jetbrains.kotlin.psi.KtVisitor.visitObjectDeclaration(KtVisitor.java:37)
at org.jetbrains.kotlin.psi.KtVisitorVoid.visitObjectDeclaration(KtVisitorVoid.java:413)
at org.jetbrains.kotlin.psi.KtVisitorVoid.visitObjectDeclaration(KtVisitorVoid.java:1013)
at org.jetbrains.kotlin.psi.KtVisitorVoid.visitObjectDeclaration(KtVisitorVoid.java:21)
at org.jetbrains.kotlin.psi.KtObjectDeclaration.accept(KtObjectDeclaration.kt:63)
at org.jetbrains.kotlin.psi.KtElementImplStub.accept(KtElementImplStub.java:59)
at org.jetbrains.kotlin.cli.metadata.MetadataSerializer.performSerialization(MetadataSerializer.kt:60)
at org.jetbrains.kotlin.cli.metadata.MetadataSerializer.serialize(MetadataSerializer.kt:48)
at org.jetbrains.kotlin.cli.metadata.K2MetadataCompiler.doExecute(K2MetadataCompiler.kt:111)
at org.jetbrains.kotlin.cli.metadata.K2MetadataCompiler.doExecute(K2MetadataCompiler.kt:40)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:86)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:44)
at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:98)
at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1549)
at jdk.internal.reflect.GeneratedMethodAccessor164.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:359)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:691)
at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at java.base/java.lang.Thread.run(Thread.java:832)
Matthew Bartos
10/20/2020, 7:50 AMkotlinx.serialization
and I want to show them the performance comparison between GSON
and kotlinx.serialization
Can anyone show me some proper benchmarks?Alec Muffett
10/20/2020, 3:48 PMWire Kotlin
section) which I've used in Java before to provide elegant/ish cross-platform serialisation.
What I am seeking is: perspective on whether the problems which Wire addresses for Java, are still an issue with native Kotlin protobuf support and/or serialisation?
Typically Java coders who like Wire are looking for generation of lightweight (field-not-getter) code for Java - to reduce method proliferation - and simpler syntax. Wire has Kotlin support, but given Kotlin's pragmatism, I am wondering how necessary it is, please?Javier
10/21/2020, 10:05 AM@Serializer
in companion objects?christophsturm
10/21/2020, 11:08 AMUnbound public symbol for public kotlinx.serialization.json/JsonElementSerializer.patch
andyg
10/22/2020, 9:19 AMsuper
to leverage. Thank you.savrov
10/23/2020, 4:38 PMSerializationException: Serializer for class 'ApiResponse' is not found. Mark the class as @Serializable or provide the serializer explicitly.
My ApiResponse
class looks like this:
@Serializable(with = ApiResponseSerializer::class)
class ApiResponse<T>(
@SerialName("data")
val data: T? = null,
@SerialName("error")
val error: ApiError? = null
)
And ApiResponseSerializer
, that is used in annotation above is:
class ApiResponseSerializer<T>(private val dataSerializer: KSerializer<T>) : KSerializer<ApiResponse<T>> {
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ApiResponseDataSerializer") {
val dataDescriptor = dataSerializer.descriptor
element("data", dataDescriptor)
element("error", ApiError.serializer().descriptor)
}
override fun deserialize(decoder: Decoder): ApiResponse<T> =
decoder.decodeStructure(descriptor) {
var data: T? = null
var error: ApiError? = null
loop@ while (true) {
when (val i = decodeElementIndex(descriptor)) {
0 -> data = decodeSerializableElement(descriptor, i, dataSerializer)
1 -> error = decodeSerializableElement(descriptor, i, ApiError.serializer())
CompositeDecoder.DECODE_DONE -> break
else -> throw SerializationException("Unknown index $i")
}
}
ApiResponse(data, error)
}
override fun serialize(encoder: Encoder, value: ApiResponse<T>) {
encoder.encodeStructure(descriptor) {
encodeNullableSerializableElement(descriptor, 0, dataSerializer, value.data)
encodeNullableSerializableElement(descriptor, 1, ApiError.serializer(), value.error)
}
}
}
Then, when i’m trying to serialise my data object, i receive an exception I’ve mentioned above.
Json.encodeToString(ApiResponse(data = response.data))
---- OR ----
Json.encodeToString(ApiResponse.serializer(T::class.serializer()), ApiResponse(data = response.data))
Can someone tell me where i’m wrong? Thank you.jaqxues
10/24/2020, 3:39 PMapp:compileDebugKotlin
for me now, is that a known issue or what is going on?Paul Griffith
10/26/2020, 11:43 PMtype
key, but if I type the field in the data class to the specific sealed class member, it just serializes the different properties and does not include the type discriminator (by design, surely - but I'm hoping to avoid it anyways)Tatum Alenko
10/27/2020, 7:07 AMEvilthreads669966
10/27/2020, 8:59 AMkingsley
10/27/2020, 10:33 AMNikky
10/27/2020, 12:03 PMstarsep
10/28/2020, 12:06 PMFooResponse
is sealed class, I don't control response and therefore cannot add type discriminator as described in https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/polymorphism.md#sealed-classes
At the moment I use this ugly code, is there a better way?
val jsonData = jsonSerializer.parseToJsonElement(responseData)
try {
Json.decodeFromJsonElement<FooResponse.SuccessData>(jsonData)
} catch (e: SerializationException) {
try {
Json.decodeFromJsonElement<FooResponse.AnotherCase>(jsonData)
} catch (e: SerializationException) {
Json.decodeFromJsonElement<FooResponse.ErrorData>(jsonData)
}
}
Jovan
10/28/2020, 12:42 PMval module = SerializersModule {
polymorphic(Project::class) {
subclass(OwnedProject::class)
}
}
So, I was looking into Open polymorphism and can’t get it working for me.
For some reason it only works when I have two levels, like in the example from above. How to init SerializersModule in case I have 3+ levels (e.g. OwnedProject is parent of OwnedChildeProject)?rnentjes
10/28/2020, 3:17 PMval module = SerializersModule {
polymorphic(Project::class) {
subclass(OwnedProject::class)
}
}
Is there up to date documentation somewhere?Joaquim Ley
10/28/2020, 3:23 PM[14:55] kotlinx.serialization.json.internal.JsonDecodingException: Unexpected JSON token at offset 82: Expected string literal with quotes.For some context the body seems to be cut randomly and the rest of the response is not parsed, using latest versions for both ktor and kotlinx.serialisation
rnentjes
10/28/2020, 3:36 PMjava.lang.NoSuchMethodError: kotlinx.serialization.internal.AbstractPolymorphicSerializer.findPolymorphicSerializerOrNull(Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)Lkotlinx/serialization/SerializationStrategy;
at kotlinx.serialization.PolymorphicSerializerKt.findPolymorphicSerializer(PolymorphicSerializer.kt:96)
at kotlinx.serialization.json.internal.PolymorphicKt.findActualSerializer(Polymorphic.kt:29)
at kotlinx.serialization.json.internal.PolymorphicKt.access$findActualSerializer(Polymorphic.kt:1)
at kotlinx.serialization.json.internal.StreamingJsonEncoder.encodeSerializableValue(StreamingJsonEncoder.kt:226)
at kotlinx.serialization.encoding.AbstractEncoder.encodeSerializableElement(AbstractEncoder.kt:81)
at kotlinx.serialization.internal.MapLikeSerializer.serialize(CollectionSerializers.kt:123)
at kotlinx.serialization.json.internal.StreamingJsonEncoder.encodeSerializableValue(StreamingJsonEncoder.kt:223)
at kotlinx.serialization.encoding.AbstractEncoder.encodeSerializableElement(AbstractEncoder.kt:81)
This is KMM with serialization plugin 1.4.10 and dependency 'kotlinx-serialization-json:1.0.0' in common. The error happens on the jvm with a sealed class.rnentjes
10/28/2020, 3:36 PMjava.lang.NoSuchMethodError: kotlinx.serialization.internal.AbstractPolymorphicSerializer.findPolymorphicSerializerOrNull(Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)Lkotlinx/serialization/SerializationStrategy;
at kotlinx.serialization.PolymorphicSerializerKt.findPolymorphicSerializer(PolymorphicSerializer.kt:96)
at kotlinx.serialization.json.internal.PolymorphicKt.findActualSerializer(Polymorphic.kt:29)
at kotlinx.serialization.json.internal.PolymorphicKt.access$findActualSerializer(Polymorphic.kt:1)
at kotlinx.serialization.json.internal.StreamingJsonEncoder.encodeSerializableValue(StreamingJsonEncoder.kt:226)
at kotlinx.serialization.encoding.AbstractEncoder.encodeSerializableElement(AbstractEncoder.kt:81)
at kotlinx.serialization.internal.MapLikeSerializer.serialize(CollectionSerializers.kt:123)
at kotlinx.serialization.json.internal.StreamingJsonEncoder.encodeSerializableValue(StreamingJsonEncoder.kt:223)
at kotlinx.serialization.encoding.AbstractEncoder.encodeSerializableElement(AbstractEncoder.kt:81)
This is KMM with serialization plugin 1.4.10 and dependency 'kotlinx-serialization-json:1.0.0' in common. The error happens on the jvm with a sealed class.sandwwraith
10/28/2020, 6:30 PMrnentjes
10/28/2020, 7:24 PM