【发布时间】:2009-10-22 03:05:22
【问题描述】:
我应该使用哪种序列化?
我需要存储一个包含 100000 多个元素的大型字典,我只需要直接保存和加载这些数据,而不关心它是二进制还是格式化。
现在我正在使用 BinarySerializer 但不确定它是否最有效?
请在 .NET 标准库或外部库中提出更好的替代方案,最好是免费的。
编辑:这是序列化到磁盘并从中序列化。该应用程序也是单线程的。
【问题讨论】:
标签: c# .net serialization
我应该使用哪种序列化?
我需要存储一个包含 100000 多个元素的大型字典,我只需要直接保存和加载这些数据,而不关心它是二进制还是格式化。
现在我正在使用 BinarySerializer 但不确定它是否最有效?
请在 .NET 标准库或外部库中提出更好的替代方案,最好是免费的。
编辑:这是序列化到磁盘并从中序列化。该应用程序也是单线程的。
【问题讨论】:
标签: c# .net serialization
嗯,这将取决于字典中的内容 - 但如果 Protocol Buffers 对您来说足够灵活(您必须定义自己的类型来序列化 - 它不会执行所有 .NET 类型或类似的事情),它的速度非常快。
例如,在协议缓冲区中,我会将字典表示为带有重复键/值对字段的消息。为了获得最高速度,您可以使用CodedOutputStream 和CodedInputStream 直接序列化/反序列化字典,而不是先将其全部读入内存。同样,这取决于键/值类型是什么。
【讨论】:
这完全是一个猜测,因为我没有对此进行分析(即,你应该这样做才能真正得到你的答案)。
但我的猜测是二进制序列化程序会给你最好的性能。无论是规模还是速度。
【讨论】:
这是一个有点开放式的问题。您是将其存储在内存中还是将其写入磁盘?这是否在多线程(可能还有多并发访问)环境中执行?上下文很重要。
BinarySerializer 通常会很快,并且有一些外部库可以提供更好的压缩,例如 ProtoBuffers。我个人在 DataContractSerializer 方面取得了很好的成功。
所有这些选项的好处在于您可以尝试所有这些选项(相对轻松),以自己了解在您的环境和操作中有效的方法。
【讨论】: