首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >kotlinx反/序列化密封类/枚举

kotlinx反/序列化密封类/枚举
EN

Stack Overflow用户
提问于 2020-06-07 17:44:33
回答 1查看 2.2K关注 0票数 1

使用kotlin编写聊天应用程序,历史上使用nodejs,我有/output格式的websocket对象:

代码语言:javascript
复制
{"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"}}}

尝试采用kotlinx序列化,以便能够在没有运气的情况下使用这种方法,似乎sealed class是我可以尝试的最接近的方法,但是如何将type更改为action

采用这种方法,https://ahsensaeed.com/sealed-classes-kotlinx-serialization-deserialization/试图执行如下操作:

代码语言:javascript
复制
@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)
    }
}

然后打电话:

代码语言:javascript
复制
    val act = BackendAction.Auth("blah")
    val serializer = BackendActionSerializer()
    val data = serializer.toTString(act)

给出{"action":"com.project.path.BackendAction.Auth","payload":"blah"},所以我需要将com.project.path.BackendAction.Auth映射到authorize

编辑:

回答我的问题:@SerialName("authorize")很简单:)

代码语言:javascript
复制
@Polymorphic
@Serializable
sealed class BackendAction{
    @Serializable
    @SerialName("authorize")
    data class Auth(
        var payload: String = ""
    ) : BackendAction()
}

这个聊天应用程序的web用户界面工作在这里:https://www.lonje.com/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-08 05:22:16

@SerialName("authorize")做到了这一点

代码语言:javascript
复制
@Polymorphic
@Serializable
sealed class BackendAction{
    @Serializable
    @SerialName("authorize")
    data class Auth(
        var payload: String = ""
    ) : BackendAction()
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62249319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档