C# 在.NET中,哪种方法在跨线移动对象时最有效?

C# 在.NET中,哪种方法在跨线移动对象时最有效?,c#,.net,serialization,compression,C#,.net,Serialization,Compression,我一直在使用Web服务在网络上移动数据,这对我很有帮助。它擅长发送小块数据。只要您必须移动具有大量属性的深层对象树,生成的XML soup就会占用100k数据并将其转换为1MB 所以我试过了,但这让我感到不安。它很好地压缩了数据,但取舍是压缩/解压缩。然后我通过BinaryFormatter序列化了这些对象,并将其发送给了其他人。这是更好的,但是,编码/解码的速度仍然保持不变 无论如何,我听说我被困在00年代,现在有更好的方法通过网络发送数据,如ProtocolBuffers、MessagePa

我一直在使用Web服务在网络上移动数据,这对我很有帮助。它擅长发送小块数据。只要您必须移动具有大量属性的深层对象树,生成的XML soup就会占用100k数据并将其转换为1MB

所以我试过了,但这让我感到不安。它很好地压缩了数据,但取舍是压缩/解压缩。然后我通过BinaryFormatter序列化了这些对象,并将其发送给了其他人。这是更好的,但是,编码/解码的速度仍然保持不变

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

有人能告诉我这些新协议是否更适合发送大量数据,以及我是否缺少其他有效的方法来实现这一点


所谓高效,我指的是带宽的大小、编码/解码的速度、实现的速度等等。

这取决于您的大部分数据是由什么组成的。如果你只是有很多对象和一些字段,而这些字段实际上是“扩展”它们的关键所在,那么其他格式(如协议缓冲区)可以产生巨大的差异。我没有使用过MessagePack或Thrift,但我希望它们的规模收益大致相同


就编码和解码的速度而言,我相信两者都会优于任何内置的序列化方案。

您是否签出了???

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

WCF提供了一些很好的跨线推送数据的方法,包括以及相当有效的序列化程序,如。也就是说,这些东西中的许多都需要一个“富”客户机,该客户机也在使用WCF

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

使用(用C#编写)来执行序列化,在带宽和编码/解码速度方面都是有效的。该库作为C#源代码分发


唯一的解决办法是避免.NET序列化启动-对于库不支持的数据结构,必须在客户端代码中执行显式编码,以避免调用.NET序列化。这影响了实施的速度,但我的规模提高了2-3倍,序列化所需时间提高了20-40倍。

您是在内部网还是通过互联网公开通信?@j0rd4n内部网,但它通过不同的提供商在全国范围内传播,而且大部分时间,它比互联网慢得多。以下是一些有利于protobuf-net(或任何等效协议缓冲区实现——但方便的是,protobuf-net往往很容易改装到现有模型)的技术。它几乎与我在这方面做过的每一项指标都有联系,我也做过很多;p作为旁注,我看了MsgPack,因为一些愚蠢的“比协议缓冲区快4倍”的说法,这当然是荒谬的不真实;p@Marc使用IIS压缩进一步压缩原始抛光对象有意义吗?或者,这只会不必要地增加CPU利用率,而没有什么回报?@AngryHacker:我不想说-但你不妨试试。@AngryHacker:为了扩展Jon的消息,协议缓冲区对数据进行编码,实际开销很小,但不包括传统的压缩。因此,根据您的数据,结果可能会受益于传统的压缩,但这可能会有所不同,而且有线压缩总是涉及延迟和“带宽”之间的权衡,因此IIS压缩是否会带来好处取决于您的应用程序。下面是一个有趣的关于不同绑定选项的帖子: