//проблема циклических ссылок //аллокация? [[Сравнение сериализаторов]] ### BinaryFormatter Нативное решение в c# - `BinaryFormatter` по умолчанию сериализует поля класса, включая скрытые (backing fields) для свойств (properties), но не вызывает сами свойства. - невозможно использовать `BinaryFormatter` для сериализации классов без указания атрибута `[Serializable]`. - `BinaryFormatter` в .NET решает проблему циклических ссылок. Когда объекты сериализуются с использованием `BinaryFormatter`, он отслеживает все объекты, которые уже были сериализованы, и вместо повторного сериализования создает ссылки на уже сериализованные объекты. - `BinaryFormatter` по умолчанию сериализует все поля, включая приватные. Это связано с тем, что `BinaryFormatter` использует рефлексию для доступа ко всем полям объекта, независимо от их модификаторов доступа. - `BinaryFormatter` поддерживает сериализацию полиморфных объектов, поэтому он сможет корректно сериализовать и десериализовать объекты-наследники, которые закастованы в родительский тип. У объекта все значения полей будут сохранены, включая специфичные для производного класса. - `BinaryFormatter` не рекомендуется для новых разработок из-за проблем безопасности и производительности, так как BinaryFormatter может выполнять код, который находится в сериализуемом объекте - Не сериализуются классы, которые не помечены атрибутом `[Serializable]` Если в сериализуемом классе через `BinaryFormatter` есть вложенный класс, который не помечен атрибутом `[Serializable]`, это приведет к исключению во время сериализации. `BinaryFormatter` требует, чтобы все типы, которые участвуют в процессе сериализации, были помечены атрибутом `[Serializable]`. ### Newtonsoft.Json - Не сериализуются приватные поля и свойства по умолчанию (требуется написать код с рефлексией для донастройки) - Не сериализуются backing field по умолчанию. (требуется написать код с рефлексией для донастройки) - Не поддерживает сериализацию свойств, которые возвращают значения по ссылке (ByRef) ### HyperSerializer [Библиотека](https://www.nuget.org/packages/HyperSerializer#supportedframeworks-body-tab) не поддерживает .NET Standard 2.1, который [[Поддержка .NET в Unity|поддерживает]] Unity. ### MemoryPack [Github](https://github.com/Cysharp/MemoryPack) [Nuget](https://www.nuget.org/packages/MemoryPack) > По первому впечатлению, кажется, что это наилучшее решение среди остальных. Я бы начал работать с этой библиотекой. - Быстрее, чем [[#MessagePack|MessagePack]] (приводится диаграмма в readme). - Native AOT friendly Source Generator based code generation, no Dynamic CodeGen ([[System.Reflection.Emit|IL.Emit]]) - Применяется подход [[Zero-Encoding Design]] - Если в класс, который помечен атрибутом `[MemoryPackable]`, вложен другой класс без этого атрибута, то при попытке сериализации или десериализации возникнет ошибка, так как все члены должны быть сериализуемыми. - Обязательно нужно указывать атрибут над типом (например, классом) для его сериализации (других вариантов нет). А также, необходимо указать ключевое слово partial - По умолчанию приватные поля не сериализуются. Необходимо над полем прописать атрибут `[MemoryPackInclude]`. ### MessagePack [Github](https://github.com/MessagePack-CSharp/MessagePack-CSharp) `MessagePack` будет корректно выполняться "из коробки" в среде Mono или .Net, но не среде [[IL2CPP]]. `MessagePack` использует библиотеку [[System.Reflection.Emit]], которая не поддерживается в [[IL2CPP]] ([[Почему IL2CPP не поддерживает System.Reflection.Emit?|Почему?]]). Требуются дополнительные шаги для запуска на [[IL2CPP]]. Для работы MessagePack на платформе IL2CPP [необходимо](https://github.com/MessagePack-CSharp/MessagePack-CSharp?tab=readme-ov-file#unity-support) предварительно выполнить генерацию кода. Это значит, что вы заранее определяете все типы, которые будут использоваться для сериализации и десериализации, и генерируете код для их обработки. ### FlatBuffers Официальные источники: - flatbuffers.dev -> [Use in C#](https://flatbuffers.dev/flatbuffers_guide_use_c-sharp.html) - [Nuget](https://www.nuget.org/packages/Google.FlatBuffers) - [Github](https://github.com/google/flatbuffers?tab=readme-ov-file#-flatbuffers) Релевантные источники: - [FLATBUFFERS IN UNITY - A 40X GAIN](https://blog.extrawurst.org/gamedev/unity/programming/rust/2020/12/26/unity-flatbuffers.html) Необходима предварительная генерация кода, неважно IL2CPP это или .NET Нужно написать приличное количество строк кода для сериализации, по сравнению с другими библиотеками, которые позволяют это сделать в 2 строки кода. ### Protobuf [Github](https://github.com/protobuf-net/protobuf-net?tab=readme-ov-file) - [Protobuf-net & IL2CPP - System.Reflection.Emit is not supported](https://stackoverflow.com/questions/57714689/protobuf-net-il2cpp-system-reflection-emit-is-not-supported) - [Impossible to build using IL2CPP with protobuf-net.Grpc library](https://discussions.unity.com/t/impossible-to-build-using-il2cpp-with-protobuf-net-grpc-library/925761)