/messagepack

MessagePack serializer - msgpack.org[Swift]

Primary LanguageSwiftApache License 2.0Apache-2.0

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)")