Riy*_*lla 15
您可以查看Universal Binary JSON规范.它不会像Smile一样紧凑,因为它没有名称引用,但它与JSON 100%兼容(BSON和BJSON定义了JSON中不存在的数据结构,因此没有标准转换为/从).
使用以下标准格式读取和写入也是(故意)简单易犯罪:
[type, 1-byte char]([length, 4-byte int32])([data])
Run Code Online (Sandbox Code Playgroud)
所以简单的数据类型以ASCII标记代码开头,如'I'代表32位int,'T'代表true,'Z'代表null,'S'代表字符串等等.
该设计的格式设计为快速读取,因为所有数据结构都以其大小为前缀,因此不会扫描以空值终止的序列.
例如,读取可能像这样划分的字符串([] -chars仅用于说明目的,它们不是以格式编写的)
[S][512][this is a really long 512-byte UTF-8 string....]
Run Code Online (Sandbox Code Playgroud)
你会看到'S',打开它来处理一个字符串,看到它跟随"512"的4字节整数,并且知道你可以在下一个512字节中抓住一个块并将它们解码回一个字符串.
类似地,数字值在没有长度值的情况下写出来更紧凑,因为它们的类型(byte,int32,int64,double)都定义了它们的字节长度(分别为1,4,8和8).还支持任意长数字这是非常便携的,即使在不支持它们的平台上也是如此.
平均而言,使用均衡的JSON对象(大量混合类型),您应该看到大小减少约30%.如果您想确切知道某些结构如何压缩或不压缩,可以查看" 尺寸要求"部分以获得一个想法.
从好的方面来说,无论压缩如何,数据都将以更优化的格式编写,并且使用起来更快.
我今天检查了核心的Input/OutputStream实现,以便将格式读/写到GitHub中.我将在本周晚些时候检查基于反射的一般对象映射.
您可以查看这两个类来了解如何读取和编写格式,我认为核心逻辑类似于20行代码.由于方法的抽象以及检查标记字节以确保数据文件是有效格式的一些结构,类更长; 像这样的东西.
如果您有特定的问题,例如规范的字节顺序(大)或双打的数字格式(IEEE 754),那么所有这些都会在规范文档中介绍,或者只是问我.
希望有所帮助!
是:微笑数据格式(参见维基百科条目.它具有公共Java实现,C版本正在github(libsmile)中工作.它比JSON(可靠)更紧凑,但是是100%兼容的逻辑数据模型,所以使用文本JSON来回转换是很容易和可能的.
为了性能,您可以看到jvm-serializers基准测试,其中smile与其他二进制格式(thrift,avro,protobuf)竞争良好; sizewise它不是最紧凑的(因为它确实保留了字段名称),但对于重复名称的数据流做得更好.
它被像Elastic Search和Solr(可选)这样的项目使用,Protostuff-rpc支持它,虽然它不像Thrift或protobuf那样广泛.
编辑(2011年12月) - 现在还有libsmilePHP,Ruby和Python的绑定,因此语言支持正在改进.此外还有数据大小的测量; 虽然对于单记录数据替代方案(Avro,protobuf)更紧凑,但对于数据流,由于密钥和字符串值返回参考选项,Smile通常更紧凑.
由于其普遍支持,gzipping JSON 数据将让您轻松获得良好的压缩比。此外,如果您处于浏览器环境中,您最终可能会在新库的依赖项大小方面付出比实际节省的有效负载更大的字节成本。
如果您的数据有其他约束(例如大量冗余字段值),您可以通过查看不同的序列化协议而不是坚持使用 JSON 来进行优化。示例:基于列的序列化(例如 Avro即将推出的列式存储)可能会为您带来更好的比率(对于磁盘存储)。如果您的有效负载包含大量常量值(例如表示枚举的列),则字典压缩方法也可能很有用。
| 归档时间: |
|
| 查看次数: |
16871 次 |
| 最近记录: |