Size: a a a

Kotlin Community

2020 April 04

AW

Alex Wells in Kotlin Community
Alexander Nozik
Силеды - это вообще сложно. Я правда не очень понял, что именно вам надо, если прописать сериализаторы на обе ветки, все автоматом должно генериться
возможно я просто херней занимаюсь) Есть примерно такая структура:
            "nodeType": "Expr_Assign",
           "var": {
               "nodeType": "Expr_Variable",
               "name": {
                   "nodeType": "Scalar_String",
                   "value": "huina",
                   "attributes": {
                       "startLine": 114,
                       "startFilePos": 3269,
                       "endLine": 114,
                       "endFilePos": 3275,
                       "kind": 1
                   }
               }
           }

проблема в том, что name'ом может быть и string:
            "nodeType": "Expr_Assign",
           "var": {
               "nodeType": "Expr_Variable",
               "name": "associative"
           }


и таких приколов есть достаточно. Вот я и пытаюсь упростить себе работу, что бы оно десеарилизровалось само в нужный враппер в зависимости от типа
источник

AN

Alexander Nozik in Kotlin Community
Alex Wells
возможно я просто херней занимаюсь) Есть примерно такая структура:
            "nodeType": "Expr_Assign",
           "var": {
               "nodeType": "Expr_Variable",
               "name": {
                   "nodeType": "Scalar_String",
                   "value": "huina",
                   "attributes": {
                       "startLine": 114,
                       "startFilePos": 3269,
                       "endLine": 114,
                       "endFilePos": 3275,
                       "kind": 1
                   }
               }
           }

проблема в том, что name'ом может быть и string:
            "nodeType": "Expr_Assign",
           "var": {
               "nodeType": "Expr_Variable",
               "name": "associative"
           }


и таких приколов есть достаточно. Вот я и пытаюсь упростить себе работу, что бы оно десеарилизровалось само в нужный враппер в зависимости от типа
источник

AN

Alexander Nozik in Kotlin Community
Там очень похожие примеры есть. Но разумеется, будет работать только для жсона
источник

AW

Alex Wells in Kotlin Community
так я оттуда) Просто хотел что бы магия сама со всем разобралась, как в случае с sealed. Видимо не получится
источник

AN

Alexander Nozik in Kotlin Community
Alex Wells
так я оттуда) Просто хотел что бы магия сама со всем разобралась, как в случае с sealed. Видимо не получится
Есть в жсон сериализаторе ключ для поля типа, но он глобальныц
источник

AN

Alexander Nozik in Kotlin Community
Вообще надо issue завести, там довольно легко сделать локальный тайп-ключ кастомным
источник

AW

Alex Wells in Kotlin Community
@Serializable
sealed class Sealed {
   @Serializable
   @SerialName("SealedSub")
   data class SealedSub(val i: Int) : Sealed()

   @SerialName("NestedSealed")
   open class NestedSealed : Sealed() {
       @Serializable
       data class Stringed(val s: String) : NestedSealed()

       @Serializable
       data class Complex(val i: Sealed) : NestedSealed()

       @Serializer(forClass = NestedSealed::class)
       companion object : KSerializer<NestedSealed> {
           // serializer
       }
   }
}


kotlinx.serialization.SerializationException: class net.alexwells.ptk.php.parser.Sealed$NestedSealed$Stringed is not registered for polymorphic serialization in the scope of class net.alexwells.ptk.php.parser.Sealed

На каждом шагу какие-то приколы. В чем проблема то? Я для NestedSealed указал кастомный сериалайзер, нахрен он пытается спарсить сабклассы?
источник

AW

Alex Wells in Kotlin Community
ну или я опять что-то не понимаю
источник

AW

Alex Wells in Kotlin Community
а если я сделаю NestedSealed sealed'ом, как было изначально, то SerialName у NestedSealed вообще игнорируется, а он должен быть одинаковым для Stringed и Complex
источник

VM

Vadim Morozov in Kotlin Community
В Kotlin если я правильно понял паттерн Singleton это ничто иное как companion object?
и больше ничего другого?
источник

D

Denys in Kotlin Community
Vadim Morozov
В Kotlin если я правильно понял паттерн Singleton это ничто иное как companion object?
и больше ничего другого?
Или просто object, да.
источник

AW

Alex Wells in Kotlin Community
Не прошло и дня страданий.. вышел такой говнокод:
@Serializable
   @SerialName("Variable")
   data class Variable(val name: Name) : Node() {
       @Serializable
       sealed class Name {
           @Serializable
           class Stringed(val name: String) : Name()

           @Serializable
           class Expressed(val expr: Expr) : Name()

           @Serializer(forClass = Name::class)
           companion object : UnionTypeSerializer<Name>(Name::class) {
               override fun choose(element: JsonElement): KClass<out Name> = when {
                   element is JsonLiteral && element.isString -> Stringed::class
                   element is JsonObject -> Expressed::class
                   else -> throw SerializationException("Invalid element given")
               }
           }
       }
   }
источник

AW

Alex Wells in Kotlin Community
с рефлекцией, зато без boilerplate'а)
источник
2020 April 05

AD

Apache DOG™ in Kotlin Community
Alex Wells
с рефлекцией, зато без boilerplate'а)
С бойлерплейтом увы
источник

AW

Alex Wells in Kotlin Community
Apache DOG™
С бойлерплейтом увы
сейчас сижу переделываю на moshi. kotlinx уже в край заебал. Будет чуток вербозней, но зато читабельно и без заебов на которые уходит весь день :/
источник

AW

Alex Wells in Kotlin Community
@Serializer(forClass = ClassName::class)
               companion object : UnionTypeSerializer<ClassName>(ClassName::class) {
                   override fun choose(element: JsonElement): KClass<out ClassName> = when {
                       element is JsonLiteral && element.isString -> Named::class
                       element is JsonObject && element["nodeType"]!!.content == "Stmt_Class" -> Anonymous::class
                       else -> Expr::class
                   }
               }

vs
companion object Adapter {
                   @ToJson
                   fun toJson(name: ClassName): Any = when (name) {
                       is Named -> name.name
                       is Expr -> name.expr
                       is Anonymous -> name.expr
                   }

                   @FromJson
                   fun fromJson(
                           reader: JsonReader,
                           nodeAdapter: JsonAdapter<NodeAbstract>
                   ): ClassName = when (val node = nodeAdapter.fromJson(reader)) {
                       is Name -> Named(node)
                       is Stmt.Class -> Anonymous(node)
                       is NodeAbstract.Expr -> Expr(node)
                       else -> throw JsonDataException("Unexpected node $node")
                   }
               }
источник

AW

Alex Wells in Kotlin Community
дольше, но без заебов, чисто два мапа и все. И то если захотеть, то можно и для moshi магию сделать
источник

AD

Apache DOG™ in Kotlin Community
Alex Wells
дольше, но без заебов, чисто два мапа и все. И то если захотеть, то можно и для moshi магию сделать
Почему не каким-нибудь кодогеном, по датаклассам в принципе в два экрана кода можно всякую лабуду генеритб при наличии AST
источник

AW

Alex Wells in Kotlin Community
Apache DOG™
Почему не каким-нибудь кодогеном, по датаклассам в принципе в два экрана кода можно всякую лабуду генеритб при наличии AST
потому что мои познания в котлине почти равны нулю. Я уже три дня пытаюсь десеарилизировать этот долбанный json. Не вижу смысла - проще написать 8-10 кастомных адаптеров (как вверху) и все.
источник

ВС

Владислав Славетный in Kotlin Community
Alex Wells
потому что мои познания в котлине почти равны нулю. Я уже три дня пытаюсь десеарилизировать этот долбанный json. Не вижу смысла - проще написать 8-10 кастомных адаптеров (как вверху) и все.
Так доку читай, шо ты гонишь
источник