在.NET中通过线路移动对象最有效的方法是什么?

时间:2011-06-27 19:11:14

标签: c# .net serialization compression

我一直在使用WebServices来传输数据,这对我很有帮助。它擅长发送小块数据。只要您必须移动具有大量属性的深层对象树,生成的XML汤就会获取100k的数据并将其转换为1MB。

所以我尝试了IIS Compression,但这让我感到不知所措。它压缩数据很好,但权衡是压缩/解压缩。然后我通过BinaryFormatter序列化对象并将其发送出去。然而,这更好,编码/解码的速度仍然存在。

无论如何,我听说我被困在00中,现在有更好的方法通过网络发送数据,如ProtocolBuffers,MessagePack等......

有人可以告诉我这些新协议是否更适合发送大量数据,以及我是否缺少其他有效的方法来执行此操作?

通过有效,我的意思是带宽量,编码/解码速度,实施速度等......

4 个答案:

答案 0 :(得分:11)

这取决于构成大部分数据的内容。如果你有很多带有少量字段的对象,并且它真的是“扩展”它们的残余,那么其他格式如协议缓冲区可以产生巨大的差异。我没有使用过MessagePack或Thrift,但我希望它们的大小可以大致相同。

就编码和解码速度而言,我相信Marc Gravell's implementation of Protocol Buffersmy own都将胜过任何内置序列化方案。

答案 1 :(得分:6)

这在很大程度上取决于您的优先级所在,以及您正在使用的客户类型。

WCF提供了一些通过线路推送数据的好方法,包括many binding options以及相当高效的序列化器,例如DataContractSerializer。话虽这么说,其中许多东西都需要一个“富”的客户端,它也使用WCF。

如果这不是一个选项,那么像Protocol Buffers这样的东西可能是一个非常好的方法。这为大多数数据提供了非常快速的序列化/反序列化以及合理的传输大小。

答案 2 :(得分:2)

你签出了Protobuf-net ??

答案 3 :(得分:1)

使用Simon Hewitt's library(用C#编写)来执行序列化,在带宽和编码/解码速度方面都很有效。该库以C#源代码的形式发布。

唯一的问题是避免使用.NET序列化 - 对于库不支持的数据结构,必须在客户端代码中进行显式编码,以避免调用.NET序列化。这会影响实施的速度,但是我的尺寸改进了2-3倍,系列化时间缩短了20-40倍。