【问题标题】:Best Serialization for a scenario where performance is paramount and data form is unimportant in .NET?对于性能至关重要且数据形式在 .NET 中不重要的场景的最佳序列化?
【发布时间】:2009-10-22 03:05:22
【问题描述】:

我应该使用哪种序列化?

我需要存储一个包含 100000 多个元素的大型字典,我只需要直接保存和加载这些数据,而不关心它是二进制还是格式化。

现在我正在使用 BinarySerializer 但不确定它是否最有效?

请在 .NET 标准库或外部库中提出更好的替代方案,最好是免费的。

编辑:这是序列化到磁盘并从中序列化。该应用程序也是单线程的。

【问题讨论】:

    标签: c# .net serialization


    【解决方案1】:

    嗯,这将取决于字典中的内容 - 但如果 Protocol Buffers 对您来说足够灵活(您必须定义自己的类型来序列化 - 它不会执行所有 .NET 类型或类似的事情),它的速度非常快。

    例如,在协议缓冲区中,我会将字典表示为带有重复键/值对字段的消息。为了获得最高速度,您可以使用CodedOutputStream 和CodedInputStream 直接序列化/反序列化字典,而不是先将其全部读入内存。同样,这取决于键/值类型是什么。

    【讨论】:

    • 谢谢乔恩。它基本上是 ,其中 media 有 1 个 int 和 2 个字符串公共成员和 1 个私有静态成员。它是否关心私人成员。同样对于 PB,您是否只是将内容标记为可序列化,还是比这更复杂,因为您可以用 10 种不同的方式序列化同一事物?
    • 您描述“消息”中涉及的类型,然后为您自动生成类(作为部分类,因此您可以根据需要添加自己的逻辑)。
    • 谢谢乔恩,我一定会试试的。如果是你写的,那就不会错了。
    【解决方案2】:

    这完全是一个猜测,因为我没有对此进行分析(即,你应该这样做才能真正得到你的答案)。

    但我的猜测是二进制序列化程序会给你最好的性能。无论是规模还是速度。

    【讨论】:

      【解决方案3】:

      这是一个有点开放式的问题。您是将其存储在内存中还是将其写入磁盘?这是否在多线程(可能还有多并发访问)环境中执行?上下文很重要。

      BinarySerializer 通常会很快,并且有一些外部库可以提供更好的压缩,例如 ProtoBuffers。我个人在 DataContractSerializer 方面取得了很好的成功。

      所有这些选项的好处在于您可以尝试所有这些选项(相对轻松),以自己了解在您的环境和操作中有效的方法。

      【讨论】:

        猜你喜欢
        • 2012-09-04
        • 1970-01-01
        • 2014-05-18
        • 2013-04-29
        • 2013-07-08
        • 2017-09-06
        • 2013-03-23
        • 1970-01-01
        • 2010-09-20
        相关资源
        最近更新 更多