如何使用 kotlinx.serialization 在 Ktor 中序列化 Web Socket Frame.text

Posted

技术标签:

【中文标题】如何使用 kotlinx.serialization 在 Ktor 中序列化 Web Socket Frame.text【英文标题】:How to Serialize Web Socket Frame.text in Ktor with kotlinx.serialization 【发布时间】:2021-03-09 00:25:47 【问题描述】:
webSocket("/ws") 
            try 
                while (true) 
                    when(val frame = incoming.receive())
                        is Frame.Text -> 
                            val text = frame.readText() //i want to Serialize it to class object
                            send(Frame.Text(processRequest(text)))
                        
                        else -> TODO()
                    
                
             finally 
                TODO()
            
        

我想序列化frame.readText() 以返回类对象 我对 Ktor 世界完全陌生,我不知道这是否可能

【问题讨论】:

您能否更好地解释一下您的text 变量中有什么?这是一个JSON字符串?或者是其他东西?如果你有一个 JSON 字符串,你可以使用 kotlinx.serialization 【参考方案1】:

您可以使用您可能已经为 ContentNegotiation 设置的底层 kotlinx.serialization。如果您还没有,可以在here 找到说明。这将需要使您的课程(我假设名称为ObjectType)可使用@Serializable 序列化。有关如何使类可序列化以及如何编码/解码为 JSON 格式的更多详细信息 here。我包含了解决方案 sn-p:

webSocket("/ws") 
            try 
                while (true) 
                    when(val frame = incoming.receive())
                        is Frame.Text -> 
                            val text = Json.decodeFromString<ObjectType>(frame.readText())
                            send(Frame.Text(processRequest(text)))
                        
                        else -> TODO()
                    
                
             finally 
                TODO()
            
        

我通常会使用流(需要kotlinx.coroutines

incoming.consumeAsFlow()
        .mapNotNull  it as? Frame.Text 
        .map  it.readText() 
        .map  Json.decodeFromString<ObjectType>(it) 
        .collect  object -> send(processRequest(object))
//here comes what you would put in the `finally` block, 
//which is executed after flow collection ends

【讨论】:

以上是关于如何使用 kotlinx.serialization 在 Ktor 中序列化 Web Socket Frame.text的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?