C# 中内存占用最低的最快的序列化器和反序列化器?

Posted

技术标签:

【中文标题】C# 中内存占用最低的最快的序列化器和反序列化器?【英文标题】:Fastest serializer and deserializer with lowest memory footprint in C#? 【发布时间】:2010-10-12 05:21:54 【问题描述】:

我目前正在使用二进制格式化程序(远程处理)来序列化和反序列化对象,以便在我的局域网中发送。

我最近从 2.0 升级到 .NET 3.5。 3.5 是否引入了任何新类型来提高序列化性能?

我查看了DataContractSerializer,但这会将任何内容序列化为底层 XML 权利……这必须增加内存占用。

在我的 LAN 中发送对象最快的序列化程序是什么?我不在乎互操作或版本控制……我需要速度!

我对第三方开源替代方案持开放态度。

【问题讨论】:

这里好像有两个问题...最快的序列化是一个,另一个是最小内存占用的序列化。 @Mauricio:这始终是一个平衡问题。您通常会在两种品质之间寻找最佳值,因此您会同时考虑这两种品质。 Fastest way to serialize and deserialize .NET object的可能重复 【参考方案1】:

我有一些基于 Northwind 数据集的benchmarks for the leading .NET serializers。

@marcgravell 二进制 protobuf-net 是基准测试中最快的实现,比 BCL 中可用的 Microsoft 最快的序列化程序(XML DataContractSerializer)快大约 7 倍

Microsoft 的 JsonDataContractSerializer 非常慢 - 比 protobuf-net 慢 9x,比我自己的 JsonSerializer 慢 3.6x

【讨论】:

Simon Hewitt 的图书馆怎么样?请参阅 Optimizing Serialization in .NET - part 2How to serialize big objects in .NET?【参考方案2】:

正如我在this answer 中演示的那样,生成的代码可能是最快的序列化程序。然而,它还处于早期阶段,仍然缺乏其他序列化程序提供的一些功能。

【讨论】:

【参考方案3】:

在@Luke 链接的performance comparison 中,请注意DataContractJsonSerializer 与其他MS 序列化程序相比性能非常好。

鉴于 JSON 无处不在,并且您可以轻松使用 DataContractJsonSerializer,我认为没有太多理由使用“协议缓冲区”。 JSON 在语言和平台之间跳转时会更容易调试,并且压缩得很好。

(我喜欢 Google 如何采用 CS 101 概念并因实现它们而闻名。在 C 中,我们将“协议缓冲区”称为“结构”。它们工作得很好。)

【讨论】:

C 结构(或在我的情况下为 C++)会很棒,但是 .Net(根据 OP 的要求)和 Java 不仅仅序列化结构的数据,它们还将结构定义序列化到一个点。此外,protocol buffer 允许在不破坏向后兼容性的情况下向您的消息格式添加 “新字段;” see Developer Guide.【参考方案4】:

听起来Protocol Buffers 可能就是您要找的东西。

我知道有三个 .NET 实现:protobuf-net、protobuf-csharp-port 和 Proto#。

performance comparisons 表明,Protocol Buffers 在大小和序列化/反序列化速度方面都优于内置序列化器。

【讨论】:

这三个 .NET 实现有什么区别? @StefanSteinegger 它们是不同开发人员对 protobuf 的不同实现。至于现在的情况:proto# 好像消失了,protobuf-net 和 protobuf-csharp-port 都已经被优秀的开发者实现了。正确的链接是github.com/mgravell/protobuf-net 和github.com/jskeet/protobuf-csharp-port。

以上是关于C# 中内存占用最低的最快的序列化器和反序列化器?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中序列化 DataTable 会占用大量内存 - 如何改进这一点

python 迭代器和生成器

C#序列化和反序列化到底是啥意思?

序列化和反序列化

C#关于序列化和反序列化

在 C# 中序列化和反序列化自引用对象