首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scodec组合器:标头包含用于区分类型的魔术数字。

Scodec组合器:标头包含用于区分类型的魔术数字。
EN

Stack Overflow用户
提问于 2016-01-10 03:31:36
回答 1查看 636关注 0票数 6

我正在寻找一种方法来处理类似以下示例的协议:

代码语言:javascript
复制
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代表ReadbodyType != 0将编码Write。请注意,有几个字段将判别器与受歧视的值分隔开来。

我见过一个字节排序的例子。但据我所知,这种“鱿鱼”编码的鉴别器不会往返。解决这个问题的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-10 05:19:59

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

代码语言:javascript
复制
import scodec._
import scodec.codecs._
import scodec.bits._

case class Request(bodyType: Int, foo: Int, bar: 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]
} 
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34701756

复制
相关文章

相似问题

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