Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET中快速紧凑的对象序列化_C#_.net_Serialization - Fatal编程技术网

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

C# NET中快速紧凑的对象序列化,c#,.net,serialization,C#,.net,Serialization,我想使用对象序列化在服务器和Silverlight客户端之间通过网络进行通信。 序列化是非常重要的,因为服务器将承载多个实时游戏,所以序列化的空间效率和速度非常快 我应该使用什么技巧?BinaryFormatter为这个应用程序中不需要的序列化类(版本、区域性、类名、属性名等)增加了大量开销 我可以做些什么来提高空间效率?您可以通过DeflateStream或GZipStream在传输之前对数据进行压缩。这些类位于System.IO.Compression名称空间中。您可以使用。我正在将所有序列

我想使用对象序列化在服务器和Silverlight客户端之间通过网络进行通信。 序列化是非常重要的,因为服务器将承载多个实时游戏,所以序列化的空间效率和速度非常快

我应该使用什么技巧?BinaryFormatter为这个应用程序中不需要的序列化类(版本、区域性、类名、属性名等)增加了大量开销


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

您可以通过DeflateStreamGZipStream在传输之前对数据进行压缩。这些类位于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倍

我也遇到了类似的问题,尽管我只是在使用.NET。我想通过互联网尽可能快速、方便地发送数据。我没有找到任何可以充分优化的东西,所以我创建了自己的序列化程序,名为

NetSerializer有其局限性,但它们并不影响我的用例。我已经有一段时间没有做基准测试了,但它比我发现的任何东西都快得多


我还没有在Mono或Silverlight上试过。我敢打赌它在Mono上可以工作,但我不确定Silverlight上对DynamicMethods的支持程度。

您可以尝试关注压缩数据大小并提供迄今为止最好的压缩的BOIS。(我还没有看到更好的优化。)


谢谢!你知道这会对反序列化速度造成多大的影响吗?根据我的经验,它们对巨大的数据流不是很好,但对于大多数其他情况,影响很小,但你需要尝试一下,并测量时间影响。只需向序列化调用添加几行代码,因此很容易尝试。谢谢。这些实现似乎也适用于silverlight@顺便说一句,如果您想减少更改,您是否意识到protobuf net可以直接挂接到BinaryFormatter?您可以在根对象上实现ISerializable,只需调用Serializer.Serialize/Serializer即可。Merge@Jorge-出于好奇,你选择了哪种框架?如果答案是“乔恩的”,我不会生气-我只是感兴趣。。。我很高兴它对你有用,不管是哪种。@Marc-我在用你的。它似乎更灵活,更好地与.NET framework集成。没有语言标识符的链接(使用较新的URL格式)。哦!迟到了一个小时-我已经在试验protobuf网络了,真的很棒,非常感谢!向类添加ProtoContract属性和向成员添加ProtoMember属性是否是使用库所必需的@