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

.NET中快速紧凑的对象序列化

如何解决《.NET中快速紧凑的对象序列化》经验,为你挑选了5个好方法。

我想使用对象序列化在Mono服务器和Silverlight客户端之间通过网络进行通信.序列化节省空间并且速度非常快非常重要,因为服务器将承载多个实时游戏.

我应该使用什么技术?BinaryFormatter为此应用程序中不需要的序列化类(版本,文化,类名,属性名等)增加了大量开销.

我能做些什么来提高空间效率?



1> Jorge Villue..:

您可以使用Protocol Buffers.我正在将所有序列化代码从BinaryFormatter更改为Protocol Buffers并获得非常好的结果.它在时间和空间上都更有效率.

Jon Skeet和Marc Gravell有两个.NET实现.

更新:官方.NET实现可以在这里找到.


@Jorge - 顺便说一句,你是否意识到如果你想减少变化,protobuf-net可以直接挂钩到BinaryFormatter?您可以在根对象上实现ISerializable,并只需调用Serializer.Serialize/Serializer.Merge
@Marc - 我正在使用你的.它似乎更灵活,更好地与.NET框架集成.

2> mythz..:

我有一些基于Northwind数据集的领先.NET序列化程序的基准测试.

Northwind .NET序列化基准测试

@marcgravell二进制protobuf-net是基准测试的最快实现,比BCL中可用的Microsoft最快串行器(XML DataContractSerializer)快约7倍.

我还维护了一些开源的高性能.NET文本序列化器:

JSV TypeSerializer是一种紧凑,干净,类似JSON + CSV的格式,比DataContractSerializer快3.1倍

以及速度快2.6倍的JsonSerializer.



3> Marc Gravell..:

作为作者,我邀请您尝试protobuf-net ; 它附带了Mono 2.0和Silverlight 2.0的二进制文件,并且快速高效.如果您有任何问题,请给我发电子邮件(请参阅我的Stack Overflow个人资料); 支持是免费的.

Jon的版本(参见之前接受的答案)也非常好,但IMO的protobuf-net版本更适合C# - 如果您将C#与Java谈论,Jon会是理想的,因此您可以在两端使用类似的API.



4> Tomba..:

虽然我只是使用.NET,但我遇到了类似的问题.我希望尽可能快速,轻松地通过Internet发送数据.我没有找到任何足够优化的东西,所以我制作了自己的序列化程序,名为NetSerializer.

NetSerializer有其局限性,但它们并没有影响我的用例.我暂时没有做基准测试,但它比我发现的其他任何东西都要快得多.

我没有在Mono或Silverlight上试过它.我敢打赌它适用于Mono,但我不确定Silverlight上DynamicMethods的支持程度.



5> Pablote..:

您可以尝试使用JSON.它不像协议缓冲区那样具有带宽效率,但使用Wireshark等工具监控消息要容易得多,这在调试问题时有很大帮助..NET 3.5附带一个JSON序列化程序.

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