【问题标题】:How to increase deserialization speed?如何提高反序列化速度?
【发布时间】:2010-12-09 21:23:09
【问题描述】:

使用 BinaryFormatter 进行序列化/反序列化,生成的序列化文件大小约为 80MB。反序列化需要几分钟。我该如何改进呢?下面是反序列化代码:

    public static Universe DeserializeFromFile(string filepath)
    {
        Universe universe = null;

        FileStream fs = new FileStream(filepath, FileMode.Open);

        BinaryFormatter bf = new BinaryFormatter();
        try
        {
            universe = (Universe)bf.Deserialize(fs);
        }
        catch (SerializationException e)
        {
            Console.WriteLine("Failed to deserialize. Reason: " + e.Message);
            throw;
        }
        finally
        {
            fs.Close();
        }

        return universe;
    }

可能在反序列化之前全部读入内存或使用其他序列化技术?

【问题讨论】:

    标签: c# performance serialization binaryformatter


    【解决方案1】:

    试试UnsafeDeserialize。据说可以提高速度。

    【讨论】:

    • UnsafeDeserialize 460138 ms,反序列化 459967 ms.. 即。反序列化实际上更快!我将带有 UnsafeDeserialize 的标头设置为 null,这可能是原因吗?
    【解决方案2】:

    请看一下这个thread

    【讨论】:

      【解决方案3】:

      尝试一次将文件读入内存流,然后使用内存流进行反序列化。

      【讨论】:

      • 如果这让事情变得更好而不是更糟,那么序列化格式很糟糕。为什么一个 I/O 密集型任务后跟一个 CPU 密集型任务,而你可以同时执行这两个任务,交错?
      【解决方案4】:

      数据有多复杂?如果它是一个对象(而不是一个完整的),那么尝试protobuf-net 可能会得到一些有趣的结果。它通常很容易适应现有的类,并且通常更小、更快、更不脆弱(您可以更改对象模型而不会破坏数据)。

      披露:我是作者,所以可能会有偏见 - 但它真的不可怕......不过,我很乐意提供一些*时间来帮助你尝试。

      *=在合理范围内

      【讨论】:

        【解决方案5】:

        我知道这是一个老问题,但偶然发现了一个大大提高了我的反序列化速度的解决方案。如果您有大量数据,这很有用。

        将您的目标框架升级到 4.7.1+ 并在您的 app.config 中启用以下开关。

        <runtime>
            <!-- Use this switch to make BinaryFormatter fast with large object graphs starting with .NET 4.7.2 -->
            <AppContextSwitchOverrides value="Switch.System.Runtime.Serialization.UseNewMaxArraySize=true" />
        </runtime>
        

        来源: BinaryFormatter AppContextSwitchOverrides

        【讨论】:

          【解决方案6】:

          在 Universe 类中实现 ISerializable

          【讨论】:

            猜你喜欢
            • 2019-12-24
            • 1970-01-01
            • 1970-01-01
            • 2019-06-02
            • 1970-01-01
            • 2016-02-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多