加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – Scodec组合器:标头包含用于区分类型的幻数

发布时间:2020-12-16 18:17:17 所属栏目:安全 来源:网络整理
导读:我正在寻找一种方法来处理如下例子的协议: case class Request(bodyType: Int,foo: Int,bar: Int,body: RequestBody)sealed trait RequestBodycase class Read(key: String) extends RequestBodycase class Write(key: String,value: Array[Byte]) extends
我正在寻找一种方法来处理如下例子的协议:

case class Request(bodyType: Int,foo: Int,bar: Int,body: RequestBody)

sealed trait RequestBody
case class Read(key: String) extends RequestBody
case class Write(key: String,value: Array[Byte]) extends RequestBody

这里,bodyType == 0代表Read,bodyType!= 0代表Write.
注意,有一些字段将鉴别器与鉴别值分开.

我见过an example with byte-ordering.
但据我所知,这种“鱿鱼”编码鉴别器不会往返.
解决这个问题的正确方法是什么?

解决方法

有几种方法可以做到,但这是我用过的方法:

import scodec._
import scodec.codecs._
import scodec.bits._

case class Request(bodyType: Int,body: RequestBody)

sealed trait RequestBody
case class Read(key: String) extends RequestBody
object Read {
  implicit val codec: Codec[Read] = ("key" | utf8).as[Read]
  implicit val discriminator: Discriminator[RequestBody,Read,Int] = Discriminator(0)
}
case class Write(key: String,value: ByteVector) extends RequestBody
object Write {
  implicit val codec: Codec[Write] = {
    ("key"   | utf8  ) ::
    ("value" | bytes )
  }.as[Write]
  implicit val discriminator: Discriminator[RequestBody,Write,Int] = Discriminator(1)
}

object Request {
  implicit val codec: Codec[Request] = {
    ("bodyType" | uint16 ).flatPrepend { bodyType =>
    ("foo"      | uint16 ) ::
    ("bar"      | uint16 ) ::
    ("body"     | Codec.coproduct[RequestBody].discriminatedBy(provide(bodyType)).auto)
  }}.as[Request]
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读