Передовые методы серийного кодирования
Для предотвращения ошибок и оптимизации производительности серийного кодирования в проекте примените следующие методы кодирования и организационные принципы.
Безопасность потока
Мост Unity APIs может быть вызван только из главного потока. Не вызывать Unity APIs от конструкторов и полевых инициализаторов сериализированные типы потому что они работают на отдельном потоке загрузки.
В разработка построений, Unity выводит ошибку при попытке вызвать главный поток APIs из потока загрузки. В сборке выпуска код запускается без ошибок, но может вызывать сбои и другие неожиданные действия в приложении.
Тип: чтобы снизить риск ошибок во время сериализации, не вызывайте методы API, способные повлиять на состояние проекта или связанных объектов Unity. К безопасным для вызова API относятся Debug.Log и те, которые работают с простыми типами данных, такими как математические функции и Vector3.
Финалисты
Не инициируйте сериализацию из методов финализатора. Финалисты не работают на главном потоке. мусорщик определяет, когда они запускаются, а в некоторых случаях они могут вообще не запускаться.
Попытка серийного кодирования данных из финализатора может привести к неожиданному поведению и сбоям. Дополнительные сведения см. в документации Майкрософт по Финалисты.
Организация данных
Вы можете организовать свои данные следующим образом, чтобы обеспечить оптимальное использование сериализации Unity:
- Стремитесь к тому, чтобы Unity сериализировал наименьший возможный набор данных. Цель этого не в том, чтобы сэкономить место на жестком диске вашего компьютера, а чтобы убедиться, что вы можете поддерживать обратную совместимость с предыдущими версиями проекта. Обратная совместимость может стать более сложной позже в разработке, если вы работаете с большими наборами серийных данных.
- Никогда не позволяйте Unity серийизировать дубликаты данных или кэшируемые данные. Это вызывает значительные проблемы для обратной совместимости: это несет высокий риск ошибок, потому что данные могут выйти из синхронизации.
- При добавлении полей, которые ссылаются на пользовательские классы или структуры C#, следует проявлять осторожность. Когда вы ссылаетесь на пользовательские классы или структуры C# в полях, Unity вставляет все содержимое объекта, на который делается ссылка, в сериализированные данные объекта, на который делается ссылка. Если эта структура становится сложной или глубоко вложенной, тогда может быть трудно перенести эти данные, когда вы измените структуру в будущем. Кроме того, данные из объекта могут легко непреднамеренно повторяться более чем один раз в сериализированных данных. Вместо этого, стремитесь сохранить структуру в ваших производных классах MonoBehaviour и ScriptableObject плоской и простой.
- Способ совместного использования данных между Объектами заключается в использовании ScriptableObjects. Когда вы ссылаетесь на класс, производный от
UnityEngine.Object(например, класс, производный от ScriptableObject), Unity сериализует только ссылку, а не весь граф объектов. Поэтому данные сериализуются один раз — в ScriptableObject, а не в каждой точке, которая на него ссылается. Аналогично можно использовать[SerializeReference]атрибут, если вам нужно сослаться на один и тот же пользовательский класс C# более одного раза внутри одного MonoBehaviour или ScriptableObject. Подробнее см. Сериализация пользовательских классов.