2010-08-23 3 views
3

Я сохраняю огромный список объектов в файле и затем десериализую их. Получающийся файл xml может иметь размер около 3 гигабайт.C# - десериализация XML против двоичной десериализации - двоичная + дефляция

Я хочу Десериализация быть супер быстро, так что я попробовал все три подхода (XML, двоичные, сжатые)

Очевидно, десериализации сжатый файл занимает гораздо больше времени, чем XML один. Но я видел, что двоичная десериализация также занимает гораздо больше времени против десериализации xml. Это нормально? Shoudn't и xml и binary принимают в значительной степени то же самое время, чтобы десериализовать объект?

И что, по вашему мнению, будет лучшим вариантом для использования с точки зрения хорошего баланса между размером файла и скоростью десериализации?

ответ

5

В методе this performance comparison между всеми видами методов сериализации, которые поставляются с .NET (BinaryFormatter, XmlSerializer, DataContractSerializer и т. Д.) И protobuf, сериализатор protobuf, похоже, намного опережает сериализаторы, которые поставляются с .NET. Полученный размер также уменьшится. Если формат protobuf является для вас вариантом, я настоятельно рекомендую вам взглянуть на него. :-)

Другой вариант: если десериализация выполняется медленно, десериализуйте только те части, которые вам действительно нужны. Создайте индексный файл, который сообщает вам о смещениях объектов, которые вы пишете в файл данных, чтобы вы могли быстро десериализовать объекты, которые вам нужны, в режиме произвольного доступа.

+0

спасибо, человек, я пробовал protobuf это фантастика ... это сократило время резко. – ace

1

Настройте сериализацию полностью или путем реализации ISerializable, а затем с помощью двоичного кода (хотя пользовательский XML также может стоить экспериментировать). Не сериализуйте memoised поля, но только ключевое поле, на котором основано их значение. Ищите другие области, где вы можете уменьшить размер путем сериализации достаточной информации для построения части графика, а не полного представления графика.

Затем используйте спуск с этим.

+0

эй jon ... да, я думал о внедрении ISerializable, но вместо этого пытался protobuf ... теперь мне интересно, могу ли я дополнительно настроить сериализацию вместе с использованием protobuf. Не уверен, могу ли я использовать protobuf и до сих пор имею преимущества ISerializable? – ace