我想使用对象序列化在Mono服务器和Silverlight客户端之间通过网络进行通信.序列化节省空间并且速度非常快非常重要,因为服务器将承载多个实时游戏.
我应该使用什么技术?BinaryFormatter为此应用程序中不需要的序列化类(版本,文化,类名,属性名等)增加了大量开销.
我能做些什么来提高空间效率?
您可以使用Protocol Buffers.我正在将所有序列化代码从BinaryFormatter更改为Protocol Buffers并获得非常好的结果.它在时间和空间上都更有效率.
Jon Skeet和Marc Gravell有两个.NET实现.
更新:官方.NET实现可以在这里找到.
我有一些基于Northwind数据集的领先.NET序列化程序的基准测试.
@marcgravell二进制protobuf-net是基准测试的最快实现,比BCL中可用的Microsoft最快串行器(XML DataContractSerializer)快约7倍.
我还维护了一些开源的高性能.NET文本序列化器:
JSV TypeSerializer是一种紧凑,干净,类似JSON + CSV的格式,比DataContractSerializer快3.1倍
以及速度快2.6倍的JsonSerializer.
作为作者,我邀请您尝试protobuf-net ; 它附带了Mono 2.0和Silverlight 2.0的二进制文件,并且快速高效.如果您有任何问题,请给我发电子邮件(请参阅我的Stack Overflow个人资料); 支持是免费的.
Jon的版本(参见之前接受的答案)也非常好,但IMO的protobuf-net版本更适合C# - 如果您将C#与Java谈论,Jon会是理想的,因此您可以在两端使用类似的API.
虽然我只是使用.NET,但我遇到了类似的问题.我希望尽可能快速,轻松地通过Internet发送数据.我没有找到任何足够优化的东西,所以我制作了自己的序列化程序,名为NetSerializer.
NetSerializer有其局限性,但它们并没有影响我的用例.我暂时没有做基准测试,但它比我发现的其他任何东西都要快得多.
我没有在Mono或Silverlight上试过它.我敢打赌它适用于Mono,但我不确定Silverlight上DynamicMethods的支持程度.
您可以尝试使用JSON.它不像协议缓冲区那样具有带宽效率,但使用Wireshark等工具监控消息要容易得多,这在调试问题时有很大帮助..NET 3.5附带一个JSON序列化程序.