C# NET中快速紧凑的对象序列化
我想使用对象序列化在服务器和Silverlight客户端之间通过网络进行通信。 序列化是非常重要的,因为服务器将承载多个实时游戏,所以序列化的空间效率和速度非常快 我应该使用什么技巧?BinaryFormatter为这个应用程序中不需要的序列化类(版本、区域性、类名、属性名等)增加了大量开销C# NET中快速紧凑的对象序列化,c#,.net,serialization,C#,.net,Serialization,我想使用对象序列化在服务器和Silverlight客户端之间通过网络进行通信。 序列化是非常重要的,因为服务器将承载多个实时游戏,所以序列化的空间效率和速度非常快 我应该使用什么技巧?BinaryFormatter为这个应用程序中不需要的序列化类(版本、区域性、类名、属性名等)增加了大量开销 我可以做些什么来提高空间效率?您可以通过DeflateStream或GZipStream在传输之前对数据进行压缩。这些类位于System.IO.Compression名称空间中。您可以使用。我正在将所有序列
我可以做些什么来提高空间效率?您可以通过DeflateStream或GZipStream在传输之前对数据进行压缩。这些类位于System.IO.Compression名称空间中。您可以使用。我正在将所有序列化代码从BinaryFormatter(带压缩)更改为协议缓冲区,并获得非常好的结果。它在时间和空间上都更有效 和有两个.NET实现
更新:可以找到官方的.NET实现 您可以尝试使用JSON。它的带宽效率不如协议缓冲区,但使用Wireshark等工具监视消息会容易得多,这在调试问题时会有很大帮助。NET 3.5附带了一个JSON序列化程序。作为作者,我邀请您尝试;它附带了适用于2.0和2.0的二进制文件,并且是。如果你有任何问题,只要给我发一封电子邮件(见我的StackOverflow档案);支持是免费的
Jon的版本(见前面接受的答案)也很好,但在我看来,protobuf net版本对于C更为惯用——如果您将C与Java进行对话,Jon的版本将是理想的,因此您可以在两端使用类似的API。我遇到了一个非常类似的问题—保存到文件。但以下内容也可以在网络上使用,因为它实际上是为远程处理而设计的 解决方案是使用Simon Hewitt的库-请参阅 这篇文章的最后一段写道(粗体是我的重点): “…如果您曾经使用.NET远程处理大量 数据,你会发现有问题 可扩展性。对于少量数据,它工作得很好 足够了,但更大的数量会占用大量CPU和内存, 生成大量数据进行传输,以及 可以在内存不足的情况下失败。还有一个大问题 实际执行测试所需的时间有问题 序列化—大量数据可能使其不可行 用于应用程序……” 对于我的特殊应用程序,我得到了类似的结果,40 存储速度快了两倍,加载速度快了20倍(从 分钟到秒)。序列化数据的大小为 也大大减少了。我记不清了,但它 至少是2-3次 这很容易开始。然而,有一个 明白了:只在最高级别使用.NET序列化 级别数据结构(以获得序列化/反序列化 已启动),然后调用序列化/反序列化 函数直接用于最高级别的字段 数据结构。否则将不会有任何加速。。。 例如,如果一个特定的数据结构(例如 .NET库不支持
通用.List
)
将改为使用序列化,这是一个禁忌
以客户端代码(或类似代码)序列化列表。例如
在同一函数中,请参见“这是我们自己的编码”
如下所列
参考:-请参见“注意:这是我们唯一使用内置.NET的地方…”。我有一些基于Northwind数据集的可用信息
@MarcGravel binary protobuf net是最快的基准实现,比BCL中可用的Microsoft最快序列化程序(XML DataContractSerializer)快约7倍
我还维护了一些开源的高性能.NET文本序列化程序:
- 一种紧凑、干净、类似JSON+CSV的格式,比DataContractSerializer快3.1x
- 和a一样,它比a快2.6倍
我还没有在Mono或Silverlight上试过。我敢打赌它在Mono上可以工作,但我不确定Silverlight上对DynamicMethods的支持程度。您可以尝试关注压缩数据大小并提供迄今为止最好的压缩的BOIS。(我还没有看到更好的优化。)
谢谢!你知道这会对反序列化速度造成多大的影响吗?根据我的经验,它们对巨大的数据流不是很好,但对于大多数其他情况,影响很小,但你需要尝试一下,并测量时间影响。只需向序列化调用添加几行代码,因此很容易尝试。谢谢。这些实现似乎也适用于silverlight@顺便说一句,如果您想减少更改,您是否意识到protobuf net可以直接挂接到BinaryFormatter?您可以在根对象上实现ISerializable,只需调用Serializer.Serialize/Serializer即可。Merge@Jorge-出于好奇,你选择了哪种框架?如果答案是“乔恩的”,我不会生气-我只是感兴趣。。。我很高兴它对你有用,不管是哪种。@Marc-我在用你的。它似乎更灵活,更好地与.NET framework集成。没有语言标识符的链接(使用较新的URL格式)。哦!迟到了一个小时-我已经在试验protobuf网络了,真的很棒,非常感谢!向类添加ProtoContract属性和向成员添加ProtoMember属性是否是使用库所必需的@