Как увеличить скорость десериализации?

Сериализация / десериализация с помощью BinaryFormatter, в результате чего размер сериализованного файла составляет ~ 80 МБ. Десериализация занимает несколько минут. Как я могу это улучшить? Вот код десериализации:

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

Может быть, прочитать все в памяти перед десериализацией или использовать какой-либо другой метод сериализации?


person Carlsberg    schedule 25.10.2009    source источник


Ответы (5)


Попробуйте UnsafeDeserialize. Говорят, что это улучшает скорость.

person leppie    schedule 25.10.2009
comment
UnsafeDeserialize 460138 мс, десериализация 459967 мс .. т.е. Десериализация была на самом деле быстрее! Я установил для заголовков UnsafeDeserialize значение null, возможно, это причина? - person Carlsberg; 25.10.2009

Просмотрите этот поток.

person kv-prajapati    schedule 25.10.2009

Попробуйте сначала прочитать файл в поток памяти за один раз, а затем выполнить десериализацию с использованием потока памяти.

person Storm    schedule 25.10.2009
comment
Если от этого дела обстоят скорее лучше, чем хуже, то формат сериализации - отстой. Почему задача, связанная с вводом-выводом, , а затем задача, связанная с ЦП, если вы можете делать и то, и другое с чередованием? - person hobbs; 25.10.2009

Насколько сложны данные? Если это дерево (а не полный график), то вы можете получить интересные результаты, попробовав protobuf-net. Его обычно довольно легко вписать в существующие классы, и он, как правило, намного меньше, быстрее и менее хрупок (вы можете изменить объектную модель, не уничтожая данные).

Раскрытие информации: я автор, поэтому могу быть предвзятым - но на самом деле это не ужасно ... Я с радостью предоставлю немного * времени, чтобы помочь вам попробовать это.

* = в пределах разумного

person Marc Gravell    schedule 25.10.2009

Реализуйте ISerializable в классе Universe

person Gary    schedule 25.10.2009