MessagePack:就像 JSON。但更快,占用空间更小。
MessagePack 是一种出色的格式,是 JSON 的替代品,它以二进制形式而不是纯文本形式存储数据。对于包括 Objective-C 在内的许多语言,存储的格式几乎与语言用于在内存中存储数据并使用的原始格式相同。因此,它应该解码和编码得更快,因为在许多情况下只是执行一个从一个地方到另一个地方的记忆复制。
至少,这是理论上的,当我开始探索在 iOS 上使用 MessagePack 时,我发现官方 ObjC 库实际上比内置的 NSJSONSerialization
慢。部分原因是因为苹果已经非常优化了他们的 JSON 解析器,但我认为它应该更快。这里有一些从各种序列化选项中提取的示例统计信息。
请注意,我尝试将其与 plists
进行比较,但它们不支持 null
,这使得翻译 API 结果变得困难。当我能使其工作的时候,它比其他选项慢得多。
NSError *error = nil;
NSData *result = [TUMessagePackSerialization dataWithMessagePackObject:value options:0 error:&error];
NSError *error = nil;
id result = [TUMessagePackSerialization messagePackObjectWithData:example options:0 error:&error];
要运行测试项目;克隆仓库,然后首先从项目目录运行 pod install
您使用 TUMessagePackSerialization 类将 MessagePack 转换为 Foundation 对象,并将 Foundation 对象转换为 MessagePack。
可能转换为 MessagePack 的对象必须具有以下属性
数字不是 NaN 或无穷大。
虽然MessagePack不对字典/映射键设置任何限制,但某些库和语言可能无法解释所有类型。此类可以使用内置类型的任何一种作为键,但如果它们不遵守NSCopying协议,则可能无法使用扩展对象。
本类的目标是永不抛出异常,并在出现问题时始终返回错误。然而,至少存在一种情况,即+messagePackObjectWithData:options:error:将返回nil而不是错误。那就是当数据包含一个空对象且设置了TUMessagePackReadingNSNullAsNil时。因此,您应该检查错误是否为nil,而不是检查返回值。
测试需要Xcode 5,但该库已在iOS 6上进行了测试,并且应在旧版本上也同样适用。
David Beck (@davbeck)
TUMessagePackSerialization可根据MIT许可协议获得。有关更多信息,请参阅LICENSE文件。