适用于 Swift 的 Avro 编码/解码库。
BlueSteel 是 Gilt Tech 的 Cleanroom 项目的一部分。
在继续阅读之前,请查阅 Avro 的官方文档。
此项目的 master
分支符合 Swift 2.2 标准,因此需要使用 Xcode 7.3 或更高版本才能编译。
为了使用它提供的 API,您需要将 BlueSteel 整合到您的项目中。您可以选择
一旦集成,只需将以下 import
语句添加到任何希望使用 BlueSteel 的 Swift 文件中
import BlueSteel
有关使用 BlueSteel 的详细信息,请参阅API 文档。
由于 Avro 数据不是自描述的,我们需要在反序列化任何数据之前提供一个 Avro 架构。Schema 枚举是从 JSON 架构描述构建的,形式为字符串或 NSData。
import BlueSteel
let jsonSchema = "{ \"type\" : \"string\" }"
let schema = Schema(jsonSchema)
使用上面的 Schema,我们现在可以解码一些 Avro 二进制数据。
let rawBytes: [Byte] = [0x6, 0x66, 0x6f, 0x6f]
let avro = AvroValue(schema: schema, withBytes: rawBytes)
现在我们可以通过可选择的获取器从上面的 Avro 值获取 Swift 字符串。
if let avroString = avro.string {
print(avroString) // Prints "foo"
}
我们可以使用上面的相同 Schema 将 AvroValue 序列化为二进制。
if let serialized = avro.encode(schema) {
print(serialized) // Prints [6, 102, 111, 111]
}
通过遵守AvroValueConvertible协议!您只需使用一个函数扩展您的类型即可。
func toAvro() -> AvroValue
假设我们想要序列化一个带有以下方案的NSUUID
{
"type" : "fixed",
"name" : "UUID",
"size" : 16
}
我们可以这样扩展NSUUID
extension NSUUID : AvroValueConvertible {
public func toAvro() -> AvroValue {
var uuidBytes: [Byte] = [Byte](count: 16, repeatedValue: 0)
self.getUUIDBytes(&uuidBytes)
return AvroValue.AvroFixedValue(uuidBytes)
}
}
为了生成和序列化NSUUID,我们现在可以这样操作
let serialized: [Byte]? = NSUUID().toAvro().encode(uuidSchema)
嘿,看!现在我们有一个表示NSUUID的字节数组,它根据提供的固定方案序列化为Avro。好吧,上面这个例子可能有点过于简单。让我们看看一个更复杂的例子。假设我们有一个记录方案如下
{
"type": "record",
"name": "test",
"fields" : [
{"name": "a", "type": "long"},
{"name": "b", "type": "string"}
]
}
我们可以创建一个对应的Swift类型,可能看起来像这样
struct testStruct {
var a: Int64 = 0
var b: String = ""
}
要将testStruct转换为AvroValue,我们可以像这样扩展它
extension testStruct : AvroValueConvertible {
func toAvro() -> AvroValue {
return AvroValue.AvroRecordValue([
"a" : self.a.toAvro(),
"b" : self.b.toAvro()])
}
}
您可能已经注意到上面我们调用过.Int64和String值的.toAvro()方法。我们不必自己定义这些,因为BlueSteel为Swift原始数据类型提供了AvroValueConvertible扩展。
因此,这基本上就是对BlueSteel的快速介绍。请注意,BlueSteel仍在早期开发阶段,可能会有重大变化。
干净室项目始于一个实验,旨在用基于Swift的全新形式重新构思Gilt的iOS代码库,摒弃遗留代码。
从那时起,我们将干净室项目扩展到支持多个平台。我们的大部分代码库现在支持tvOS,除iOS外,我们的底层代码也适用于Mac OS X和watchOS。
干净室项目代码是Gilt on TV的基座,我们推出的tvOS应用程序,在新的Apple TV发布时被Apple展示(请参阅此链接)。随着时间的推移,我们将越来越多地将现有的Objective-C代码库替换为干净室实现。
与此同时,我们将关注Swift和Xcode的最新版本,并在过程中开源代码库的重要部分。
BlueSteel正在积极开发中,我们欢迎您的贡献。
如果您想为这个或任何其他干净室项目仓库做出贡献,请阅读贡献指南。
BlueSteel的API文档使用维护者是由Realm的项目jazzy生成的,由JP Simard和Samuel E. Giddins维护。