zio/zio-schema · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈
ZIO Schema
ZIO Schema 是一个基于 ZIO 的库,用于将数据结构的模式建模为一等值。
简介
ZIO Schema 帮助我们解决分布式计算中一些最常见的问题,例如序列化、反序列化和数据迁移。
它将编译期构造(数据结构的类型)转换为运行时构造(一个可以在运行时读取、操作和组合的值)。模式(Schema)是数据类型的结构。ZIO Schema 将数据类型的结构概念具体化。它为任何数据类型提供高层描述,并使其成为一等值。
为数据类型创建模式有助于我们为该数据类型编写编解码器(codecs)。因此,该库可以承载用于编写 JSON、Protobuf、CSV 等编解码器和协议的各种有用功能。
ZIO Schema 解决了哪些问题?
借助可以为 case class 和 sealed trait 自动派生的模式描述,ZIO Schema 将免费地提供强大的功能:
- 无需宏、反射或复杂的隐式推导即可实现元编程。
- 为任何受支持的协议(JSON、Protobuf 等)创建序列化和反序列化编解码器
- 根据数据结构派生标准类型类(
Eq、Show、Ordering等) - 数据类型的默认值
- 自动化 ETL(提取、转换、加载)管道
- 差异比较:对同一类型的两个值进行差异比较
- 补丁应用:将差异应用于值以更新它
- 迁移:将值从一种类型迁移到另一种类型
- 计算即数据:我们不仅可以将类型转换为值,还可以将计算转换为值。这为分布式计算开辟了全新的可能性世界。
当我们的数据结构需要被序列化、反序列化、持久化或通过网络传输时,ZIO Schema 让我们专注于数据建模,并自动为我们处理所有低级的、繁琐的细节。
ZIO Schema 正被越来越多的 ZIO 库使用,包括 ZIO Flow、ZIO Redis、ZIO SQL 和 ZIO DynamoDB。
安装
为了使用此库,我们需要在 build.sbt 文件中添加以下行:
libraryDependencies += "dev.zio" %% "zio-schema" % "1.8.5"
libraryDependencies += "dev.zio" %% "zio-schema-avro" % "1.8.5"
libraryDependencies += "dev.zio" %% "zio-schema-bson" % "1.8.5"
libraryDependencies += "dev.zio" %% "zio-schema-json" % "1.8.5"
libraryDependencies += "dev.zio" %% "zio-schema-msg-pack" % "1.8.5"
libraryDependencies += "dev.zio" %% "zio-schema-protobuf" % "1.8.5"
libraryDependencies += "dev.zio" %% "zio-schema-thrift" % "1.8.5"
libraryDependencies += "dev.zio" %% "zio-schema-zio-test" % "1.8.5"
// Required for the automatic generic derivation of schemas
libraryDependencies += "dev.zio" %% "zio-schema-derivation" % "1.8.5"
libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value % "provided"
示例
在这个简单的示例中,首先,我们为 Person 创建一个 schema,然后对两个 Person 数据类型的实例执行 diff 操作,最后,我们使用 Protobuf 协议编码一个 Person 实例:
import zio._
import zio.stream._
import zio.schema.codec.{BinaryCodec, ProtobufCodec}
import zio.schema.{DeriveSchema, Schema}
import java.io.IOException
final case class Person(name: String, age: Int)
object Person {
implicit val schema: Schema[Person] = DeriveSchema.gen
val protobufCodec: BinaryCodec[Person] = ProtobufCodec.protobufCodec
}
object Main extends ZIOAppDefault {
def run: ZIO[Any, IOException, Unit] =
ZStream
.succeed(Person("John", 43))
.via(Person.protobufCodec.streamEncoder)
.runCollect
.flatMap(x =>
Console.printLine(s"Encoded data with protobuf codec: ${toHex(x)}")
)
def toHex(chunk: Chunk[Byte]): String =
chunk.map("%02X".format(_)).mkString
}
以下是运行上述程序的输出:
Encoded data with protobuf codec: 0A044A6F686E102B
资源
- Zymposium - ZIO Schema,作者 John A. De Goes、Adam Fraser 和 Kit Langton(2021 年 5 月)
- ZIO SCHEMA: A Toolkit For Functional Distributed Computing,作者 Dan Harris(Functional Scala 2021)
- Creating Declarative Query Plans With ZIO Schema,作者 Dan Harris(ZIO World 2022)
- Describing Data...with free applicative functors (and more),作者 Kris Nuttycombe(Scala World),关于 xenomorph 库背后的理念
文档
在 ZIO Schema 主页 上了解更多!
贡献
一般准则请参阅 ZIO 贡献者指南。
摘要
在提交 PR 之前,请确保测试通过,并且代码已正确格式化
sbt prepare
sbt test
行为准则
请参阅行为准则