我们开始推出越来越多的我们产品的WAN部署(带有IIS托管的远程后端的.NET胖客户端).因此,我们试图减少线上数据的大小.
我们通过实现ISerializable(类似于this)来覆盖默认序列化,并且我们看到从12%到50%的增益.我们的大部分工作都集中在优化基元类型的数组上.是否有一种奇特的方式来序列化原始类型,除了显而易见的?
例如,今天我们按如下方式序列化一组int:
[4-bytes (array length)][4-bytes][4-bytes]
任何人都可以做得更好吗?
对于布尔数组,最明显的改进示例是在每个字节中放置8个bool,我们已经这样做了.
注意:每个bool节省7位可能看起来浪费时间,但是当你处理大量数据(我们是)时,它的加速非常快.
注意:由于与之相关的延迟,我们希望避免使用通用压缩算法.远程处理仅支持缓冲的请求/响应(没有分块编码).我意识到压缩和最佳序列化之间存在一条细微的界限,但是我们的测试表明我们可以以非常低的延迟成本提供非常具体的序列化优化.而将整个缓冲响应重新处理为新的压缩缓冲区太昂贵了.
解决方法
(与消息/类有关,而不仅仅是基元)
谷歌为这种类型的场景设计了“协议缓冲区”(它们转移大量数据) – 它们的格式紧凑(使用类似base-128编码的东西)但可扩展和版本容忍(因此客户端和服务器可以轻松升级).
在.NET世界中,我可以推荐2个协议缓冲区实现:
> protobuf-net(由我)
> dotnet-protobufs(作者:Jon Skeet)
有关信息,protobuf-net直接支持ISerializable和远程处理(它是unit tests的一部分).有性能/大小指标here.
警告:它并不是理论上最好的 – 但是务实且易于理解 – 在性能,便携性和简单性之间进行折衷.