Двоичная сериализация в .NET Core

Я работаю над проектом .NET Core и пытаюсь разобрать свой List<T> на byte[]. Используя .NET Framework, мы могли бы добиться того же, используя BinaryFormatter, но на момент написания этого вопроса похоже, что Microsoft еще не поддерживает его в .NET Core, и, похоже, в будущих выпусках этого не будет.

Кто-нибудь может сказать, как выполнить эту сериализацию в .NET Core? Кроме того, зависит ли бинарная сериализация от платформы и по этой причине она устарела в .NET Core?


person Rohit    schedule 01.03.2017    source источник
comment
Ну, по моему опыту, в целом это было ненадежно и подвержено ошибкам. (Я думал, что это вернется в netstandard2.0, но могу ошибаться.) Обходной путь — использовать другой формат сериализации — есть из чего выбирать.   -  person Jon Skeet    schedule 01.03.2017
comment
Он доступен.   -  person Hans Passant    schedule 01.03.2017


Ответы (5)


Вы можете использовать Binaron.Serializer — https://github.com/zachsaw/Binaron.Serializer. Нет необходимости украшать свой класс какими-либо атрибутами.

Отказ от ответственности: я автор Binaron.Serializer.

person Zach Saw    schedule 01.02.2020
comment
после небольшого поиска я пришел к выводу, что Binaron и MessagePack являются наиболее перспективными для быстрой и простой двоичной сериализации C#. Но я не нашел ничего, что бы сравнивало эти два напрямую. Так что трудно понять, с кем идти. Любые указатели? - person Ingmar; 22.02.2021
comment
Требуется ли для этой десериализации конструктор по умолчанию в сериализуемом классе? - person Jins Peter; 21.06.2021
comment
На данный момент для этого требуется ctor по умолчанию, пока у меня не появится свободное время, чтобы поработать над ним дальше. - person Zach Saw; 24.06.2021

Вы можете использовать MessagePack. Пакет выбирается как Пакет недели в блоге .Net.

Нугет-команда:

Install-Package MessagePack

Вы также можете ознакомиться с их исходным кодом и посмотреть, как это реализовано в ядре .net.

person Aboo    schedule 15.03.2017

.NET Core 2.1 теперь включает в себя BinaryFormatter, который вы можете использовать для этого.

Вы можете найти более подробную информацию в этом ответе.

person smn.tino    schedule 06.07.2018

Что касается размера полезной нагрузки и производительности, вы можете попробовать BOIS, который ориентирован на размер упакованных данных и обеспечивает наилучшую упаковку. Он также поддерживает .Net Core

https://github.com/salarcode/Bois

person Salar    schedule 13.03.2019

BinaryFormatter устаревает в следующих версиях .NET из-за недостатков безопасности< /а>.

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

Хотя документ об устаревании говорит, что в .NET 8 будет удалена полная инфраструктура бинарной сериализации. Я все еще надеюсь, что на это можно как-то повлиять. Недавно я открыл вопрос, чтобы обсудить возможные способы сделать двоичную сериализацию (и любую полиморфную сериализацию) безопасной: https://github.com/dotnet/runtime/issues/50909

Но, как показывают и другие ответы, существует множество настраиваемых двоичных сериализаторов, из которых вы можете выбирать. Binarion или MessagePack от @ZachSaw одинаково популярны, и я также сделал свой бинарный сериализатор public несколько лет назад (NuGet). Он пытается решить вопросы безопасности и обеспечить хорошую производительность (имеется в виду как скорость и размер).

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

person György Kőszeg    schedule 09.04.2021