Самый быстрый сериализатор и десериализатор с наименьшим объемом памяти в С#?

В настоящее время я использую средство двоичного форматирования (Remoting) для сериализации и десериализации объектов для отправки по моей локальной сети.

Недавно я обновился с 2.0 до .NET 3.5. Введены ли в версии 3.5 какие-либо новые типы для повышения производительности сериализации?

Я посмотрел на DataContractSerializer, но он сериализует все в базовый XML, что должно увеличить объем памяти.

Какой самый быстрый сериализатор для отправки объектов по моей локальной сети? Меня не волнует взаимодействие или управление версиями…. Мне нужна скорость!

Я открыт для сторонних альтернатив с открытым исходным кодом.


person CodingHero    schedule 09.03.2009    source источник
comment
Похоже, здесь есть два вопроса... Самая быстрая сериализация — одна, другая — сериализация с наименьшим размером памяти.   -  person Mauricio Scheffer    schedule 09.03.2009
comment
@Mauricio: Это всегда вопрос баланса. Обычно вы ищете оптимум между двумя качествами, поэтому рассматриваете оба одновременно.   -  person Stefan Steinegger    schedule 09.09.2011
comment
возможный дубликат Самый быстрый способ сериализации и десериализации объекта .NET   -  person nawfal    schedule 10.07.2014


Ответы (4)


Похоже, что вам нужны буферы протокола.

Мне известны три реализации .NET: protobuf-net, порт protobuf-csharp и Proto#.

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

person LukeH    schedule 09.03.2009
comment
В чем разница между этими тремя реализациями .NET? - person Stefan Steinegger; 09.09.2011
comment
@StefanSteinegger Это разные реализации protobuf от разных разработчиков. Что касается ситуации сейчас: proto#, кажется, исчез, и protobuf-net, и protobuf-csharp-port были реализованы отличными разработчиками. Правильные ссылки: github.com/mgravell/protobuf-net и github.com/jskeet/protobuf-csharp-port . - person atlaste; 26.04.2016

У меня есть несколько эталонов ведущих сериализаторов .NET доступно на основе набора данных Northwind.

Бинарный протокол @marcgravell protobuf-net — это самая быстрая из протестированных реализаций, которая примерно в 7x быстрее, чем самый быстрый доступный сериализатор Microsoft (XML DataContractSerializer) в BCL.

Microsoft JsonDataContractSerializer довольно медленный — более чем в 9x медленнее, чем protobuf-net, и более чем в 3,6x медленнее, чем мой собственный JsonSerializer.

person mythz    schedule 25.08.2010
comment
А как насчет библиотеки Саймона Хьюитта? См. раздел Оптимизация сериализации в .NET — часть 2 или < i>Как сериализовать большие объекты в .NET ?. - person Peter Mortensen; 09.09.2011

В сравнении производительности, на которое ссылается @Luke, обратите внимание, что DataContractJsonSerializer работает очень хорошо по сравнению с другими сериализаторами MS.

Учитывая повсеместное распространение JSON и простоту использования DataContractJsonSerializer, я не вижу особой причины использовать «протокольные буферы». JSON будет легче отлаживать при переключении между языками и платформами, и он прекрасно сжимается.

(Мне нравится, как Google берет концепции CS 101 и прославляется их реализацией. В C мы называем «буфер протокола» «структурой». Они прекрасно работают.)

person Frank Krueger    schedule 11.03.2009
comment
Структуры C (или C++ в моем случае) были бы великолепны, но .Net (как того требует OP) и Java не сериализуют только данные структуры, они также сериализуют определение структуры до точки. Кроме того, буфер протокола позволяет добавлять новые поля в ваши форматы сообщений без нарушения обратной совместимости; см. Руководство для разработчиков. - person Trisped; 19.02.2013

Как я показал в этом ответе, сгенерированный код может быть самым быстрым сериализатором. Однако он находится на ранней стадии, и ему все еще не хватает нескольких функций, которые предлагают другие сериализаторы.

person Toxantron    schedule 26.04.2016