ISerializationCallbackReceiver
интерфейс в UnityEngine
Описание
Интерфейс для получения обратных вызовов до и после серийизации, для обработки типов данных, которые иначе не могут быть серийизованы или десерийизованы.
Сериализатор Unity умеет автоматически сериализовать большинство типов данных, но не все. Если тип сериализовать нельзя, вы можете вручную привести данные к сериализуемому виду через обратные вызовы сериализации, объявленные в этом интерфейсе. О том, когда и зачем нужна такая ручная обработка, см. Пользовательская сериализация.
Unity вызывает OnBeforeSerialize перед серийизацией объекта. Внутри этого обратного вызова вы можете преобразовать ваши данные в то, что Unity понимает перед серийизацией Unity. После завершения обратного вызова Unity серийизирует массивы.
Unity вызывает OnAfterDeserialize после десериализации объекта. После того, как Unity запишет данные в ваши поля, используйте этот обратный вызов для преобразования десериализованных данных обратно в форму, которую вы хотите, чтобы они имели во время выполнения.
Работа, выполняемая в этих обратных вызовах, должна выполняться с осторожностью, так как серийизатор Unity работает на другом потоке, чем большинство Unity API. Рекомендуется обрабатывать только поля, которые непосредственно принадлежат объекту, чтобы сохранить нагрузку на обработку на минимальном уровне.
Этот интерфейс поддерживает сериализацию по ссылке — например, для объектов, помеченных SerializeReference атрибут. Порядок выполнения обратного вызова между этими объектами не гарантируется. Однако гарантируются следующие порядки выполнения:
OnBeforeSerializeвызывается на объекте хоста до того, как она будет вызвана на любой из управляемых ссылок объекта хоста.OnAfterDeserializeвызывается на объекте хоста до того, как она будет вызвана на любой из управляемых ссылок объекта хоста.
Для полного объяснения поведения атрибута SerializeReference см. SerializeReference. Для получения дополнительной информации о том, когда и как Unity выполняет сериализацию, см. Сериализация скриптов в Руководстве.
using UnityEngine; using System; using System.Collections.Generic;
public class SerializationCallbackScript : MonoBehaviour, ISerializationCallbackReceiver { public List<int> keys = new List<int> { 3, 4, 5 }; public List<string> values = new List<string> { "I", "Love", "Unity" };
// Create a Dictionary. The Unity serializer doesn't support Dictionary types. public Dictionary<int, string> myDictionary = new Dictionary<int, string>();
public void OnBeforeSerialize() { keys.Clear(); values.Clear(); // For each key/value pair in the dictionary, add the key to the keys list and the value to the values list foreach (var kvp in myDictionary) { keys.Add(kvp.Key); values.Add(kvp.Value); } }
public void OnAfterDeserialize() { myDictionary = new Dictionary<int, string>(); // Loop through the list of keys and values and add each key/value pair to the dictionary for (int i = 0; i != Math.Min(keys.Count, values.Count); i++) myDictionary.Add(keys[i], values[i]); }
void OnGUI() { // This callback displays the following output on three separate labels in the GameView: // "Key: 3 value: I" // "Key: 4 value: Love" // "Key: 5 value: Unity" foreach (var kvp in myDictionary) GUILayout.Label("Key: " + kvp.Key + " value: " + kvp.Value); } }
Дополнительные ресурсы: ,SerializeReference,, ,SerializeField,.
Открытые методы
| Метод | Описание |
|---|---|
| OnAfterDeserialize | Реализуйте этот обратный вызов, чтобы преобразовать данные обратно в типы данных времени выполнения после десериализации объекта. |
| OnBeforeSerialize | Реализуйте этот обратный вызов, чтобы преобразовать данные в сериализированные типы данных непосредственно перед сериализацией объекта. |