#c# #.net #serialization
#c# #.net #сериализация
Вопрос:
Мне нужно сериализовать OrderedDictionary, и мне это нужно быстро. Меня не волнует безопасность или удобочитаемость для пользователя, мне просто нужен самый быстрый способ записать OrderedDictionary в файл и прочитать его снова, при условии, что сериализация непротиворечива (тот же набор пар ключ-значение, то же содержимое файла). Является ли BinaryFormatter лучшим выбором?
Ответ №1:
Вы могли бы заглянуть в protobuf, формат сериализации Google. Существует несколько реализаций для C#:
В Интернете есть сравнение производительности.
Ответ №2:
BinaryFormatter почти наверняка самый быстрый из встроенных сериализаторов, но было бы не очень сложно измерить альтернативы и проверить.
Комментарии:
1. Вам обязательно следует посмотреть ссылку на производительность и в другом ответе — хотя и не вместо выполнения собственных тестов.
Ответ №3:
Если вы ищете самый быстрый способ, при котором дополнительное кодирование не является проблемой, вы могли бы попробовать это:
Сериализация: 1. Запишите данные вашего словаря в массив байтов в памяти. Предполагая, что ваш словарь не слишком огромен, это должно быть относительно дешево с точки зрения затрат времени. 2. Напишите небольшой заголовок, содержащий #records, а затем запишите массив в файл.
Десериализация: 1. Прочитайте # items и создайте экземпляр вашего OrderedDictionary с этим значением в качестве емкости. 2. Считайте данные обратно в массив, создавайте экземпляр каждого объекта и записывайте обратно в OrderedDictionary.
Я думаю, что это будет не намного быстрее, чем более традиционные методы, но, возможно, стоит попробовать, если вы пытаетесь выжать максимум производительности.
Более быстрым способом было бы написать свой собственный IOrderedDictionary с подробным знанием ваших объектов и сохранить их способом, оптимизированным для быстрой сериализации (например, в виде плоского буфера, который можно быстро загрузить на диск). Возможно, еще быстрее было бы использовать какой-нибудь формат файла индексации (возможно, SQLite?) и написать к нему кэширующий адаптер IOrderedDictionary. Это позволило бы вам снизить стоимость десериализации.