6

使用 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;
    }

也许在反序列化之前将所有内容读入内存或使用其他一些序列化技术?

4

6 回答 6

2

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

于 2009-10-25T11:59:23.980 回答
0

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

于 2009-10-25T11:53:23.023 回答
0

请看看这个线程

于 2009-10-25T11:29:38.223 回答
0

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

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

*=在合理范围内

于 2009-10-25T20:47:45.897 回答
0

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

将您的目标框架升级到 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

于 2021-12-20T18:31:40.940 回答
-1

在 Universe 类中实现 ISerializable

于 2009-10-25T12:24:10.280 回答