MessagePack
MessagePack is an efficient binary serialization format. It lets you exchange data among multiple languages like JSON. But it's faster and smaller. Small integers are encoded into a single byte, and typical short strings require only one extra byte in addition to the strings themselves.
Package.swift
.Package(url: "https://github.com/tris-foundation/messagepack.git", majorVersion: 0)
Memo
public enum MessagePack {
case `nil`
case int(Int)
case uint(UInt)
case bool(Bool)
case float(Float)
case double(Double)
case string(String)
case binary([UInt8])
case array([MessagePack])
case map([MessagePack : MessagePack])
case extended(Extended)
public struct Extended {
public let type: Int8
public let data: [UInt8]
public init(type: Int8, data: [UInt8]) {
self.type = type
self.data = data
}
}
}
Usage
You can find this code and more in examples.
Convenience API
let hey = MessagePack("hey there!")
let bytes = MessagePack.encode(hey)
let original = String(try MessagePack.decode(bytes: bytes))
Performance optimized
var encoder = Encoder()
encoder.encode(.string("one"))
encoder.encode(.int(2))
encoder.encode(.double(3.0))
let encoded = encoder.bytes
// be careful, we use raw pointer here
var decoder = Decoder(bytes: encoded, count: encoded.count)
// throws on invalid data
let value = try decoder.decode()
// reuse decoder
decoder.rewind()
// you can avoid extra MessagePack object
// if you sure about the structure
// throws on wrong type
let string = try decoder.decode(String.self)
let int = try decoder.decode(UInt8.self)
let double = try decoder.decode(Double.self)
print("decoded manually: \(string), \(int), \(double)")