简体   繁体   English

kotlinx de/serialization 密封类/枚举

[英]kotlinx de/serialization sealed class/enum

Writing chat app using kotlin, historically from nodejs I have websocket json objects in/output format:使用 kotlin 编写聊天应用程序,历史上来自 nodejs 我有 websocket json 对象/输出格式:

{"action": "join:chatroom", "payload", "chatroom-name"}
{"action": "leave:chatroom", "payload", "chatroom-name"}
{"action": "message", "payload", {"id": 1, "text": "blah", "user": {"name": "Roman"}}}
{"action": "notification", "payload", {"id": 1, "verb": "blah", "user": {"name": "Roman"}}}

trying to adopt kotlinx serialization to be able to work with this type of approach with no luck seems like sealed class is the closest what I can try but how to change type to action尝试采用 kotlinx 序列化以能够使用这种类型的方法而没有运气似乎sealed class是我可以尝试的最接近的方法,但是如何将type更改为action

took this approach https://ahsensaeed.com/sealed-classes-kotlinx-serialization-deserialization/ trying to do something like:采用这种方法https://ahsensaeed.com/sealed-classes-kotlinx-serialization-deserialization/试图做类似的事情:

@Polymorphic
@Serializable
sealed class BackendAction{
    @Serializable
    data class Auth(
//        val action: String = "authorize",
        val payload: String = ""
    ) : BackendAction()
}

class BackendActionSerializer {
    private val sealedModule = SerializersModule {
        polymorphic(BackendAction::class) {
            BackendAction.Auth::class with BackendAction.Auth.serializer()
        }
    }

    private val serializer: KSerializer<BackendAction>
        get() = BackendAction.serializer()

    val format: StringFormat
        get() = Json(configuration = JsonConfiguration(classDiscriminator = "action"), context = sealedModule)

    fun toStringT(json: String): BackendAction {
        return format.parse(serializer, json)
    }

    fun toTString(t: BackendAction): String {
        return format.stringify(serializer, t)
    }
}

and call:并致电:

    val act = BackendAction.Auth("blah")
    val serializer = BackendActionSerializer()
    val data = serializer.toTString(act)

gives {"action":"com.project.path.BackendAction.Auth","payload":"blah"} so I need mapping com.project.path.BackendAction.Auth to authorize给出{"action":"com.project.path.BackendAction.Auth","payload":"blah"}所以我需要映射com.project.path.BackendAction.Authauthorize

EDIT:编辑:

answering my question: @SerialName("authorize") it was easy:)回答我的问题: @SerialName("authorize")这很容易:)

@Polymorphic
@Serializable
sealed class BackendAction{
    @Serializable
    @SerialName("authorize")
    data class Auth(
        var payload: String = ""
    ) : BackendAction()
}

working web ui for this chat app here: https://www.lonje.com/在这里为这个聊天应用程序工作 web ui: https://www.lonje.com/

@SerialName("authorize") do the trick @SerialName("authorize")解决问题

@Polymorphic
@Serializable
sealed class BackendAction{
    @Serializable
    @SerialName("authorize")
    data class Auth(
        var payload: String = ""
    ) : BackendAction()
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM