当前位置:  开发笔记 > 编程语言 > 正文

原始类型的最优序列化

如何解决《原始类型的最优序列化》经验,为你挑选了1个好方法。

我们开始推出越来越多的我们产品的WAN部署(带有IIS托管的远程后端的.NET胖客户端).因此,我们试图减少线上数据的大小.

我们通过实现ISerializable(类似于此)覆盖了默认序列化,我们看到了从12%到50%的增益.我们的大部分工作都集中在优化基元类型的数组上.是否有一种奇特的方式来序列化原始类型,除了显而易见的?

例如,今天我们按如下方式序列化一组int:

[4字节(数组长度)] [4字节] [4字节]

任何人都可以做得更好吗?

对于布尔数组,最明显的改进示例是在每个字节中放置8个bool,我们已经这样做了.

注意:每个bool节省7位可能看起来浪费时间,但是当你处理大量数据(我们是)时,它的加速非常快.

注意:由于与之相关的延迟,我们希望避免使用通用压缩算法.远程处理仅支持缓冲的请求/响应(没有分块编码).我意识到压缩和最佳序列化之间存在一条细微的界限,但是我们的测试表明我们可以以非常低的延迟成本提供非常具体的序列化优化.而将整个缓冲响应重新处理为新的压缩缓冲区太昂贵了.



1> Marc Gravell..:

(与消息/类有关,而不仅仅是基元)

谷歌为这种类型的场景设计了"协议缓冲区"(它们转移大量数据) - 它们的格式紧凑(使用类似base-128编码的东西)但可扩展和版本容忍(因此客户端和服务器可以轻松升级).

在.NET世界中,我可以推荐2个协议缓冲区实现:

protobuf-net(由我)

dotnet-protobufs(作者Jon Skeet)

有关信息,protobuf-net直接支持ISerializable和远程处理(它是单元测试的一部分).有性能/尺寸度量这里.

最重要的是,您所做的只是为您的课程添加一些属性.

警告:它并不是理论上最好的 - 但是务实且易于理解- 在性能,便携性和简单性之间进行折衷.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有