ITADN
zio/zio-schema
zio/zio-schema · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

ZIO Schema

ZIO Schema 是一个基于 ZIO 的库,用于将数据结构的模式建模为一等值。

Development CI Badge Sonatype Releases Sonatype Snapshots javadoc ZIO Schema

简介

ZIO Schema 帮助我们解决分布式计算中一些最常见的问题,例如序列化、反序列化和数据迁移。

它将编译期构造(数据结构的类型)转换为运行时构造(一个可以在运行时读取、操作和组合的值)。模式(Schema)是数据类型的结构。ZIO Schema 将数据类型的结构概念具体化。它为任何数据类型提供高层描述,并使其成为一等值。

为数据类型创建模式有助于我们为该数据类型编写编解码器(codecs)。因此,该库可以承载用于编写 JSON、Protobuf、CSV 等编解码器和协议的各种有用功能。

ZIO Schema 解决了哪些问题?

借助可以为 case class 和 sealed trait 自动派生的模式描述,ZIO Schema 将免费地提供强大的功能:

  1. 无需宏、反射或复杂的隐式推导即可实现元编程。
    1. 为任何受支持的协议(JSON、Protobuf 等)创建序列化和反序列化编解码器
    2. 根据数据结构派生标准类型类(EqShowOrdering 等)
    3. 数据类型的默认值
  2. 自动化 ETL(提取、转换、加载)管道
    1. 差异比较:对同一类型的两个值进行差异比较
    2. 补丁应用:将差异应用于值以更新它
    3. 迁移:将值从一种类型迁移到另一种类型
  3. 计算即数据:我们不仅可以将类型转换为值,还可以将计算转换为值。这为分布式计算开辟了全新的可能性世界。

当我们的数据结构需要被序列化、反序列化、持久化或通过网络传输时,ZIO Schema 让我们专注于数据建模,并自动为我们处理所有低级的、繁琐的细节。

ZIO Schema 正被越来越多的 ZIO 库使用,包括 ZIO FlowZIO RedisZIO SQLZIO 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

资源

文档

ZIO Schema 主页 上了解更多!

贡献

一般准则请参阅 ZIO 贡献者指南

摘要

在提交 PR 之前,请确保测试通过,并且代码已正确格式化

sbt prepare

sbt test

行为准则

请参阅行为准则

支持

Badge-Discord与我们聊天。

许可证

License