//проблема циклических ссылок
//аллокация?
[[Сравнение сериализаторов]]
### 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)