版本:Unity 6 (6000.0)
语言英语
  • C#

ISerializationCallbackReceiver

UnityEngine 中的接口

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交内容,但我们会阅读用户提出的每一个建议的更改,并在适当情况下进行更新。

关闭

提交失败

由于某种原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

描述

用于在序列化之前和反序列化之后接收回调的接口,用于处理无法以其他方式序列化或反序列化的数据类型。

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); } }

其他资源:SerializeReferenceSerializeField

公共方法

OnAfterDeserialize实现此回调以在对象反序列化后将数据转换回运行时数据类型。
OnBeforeSerialize实现此回调以在对象序列化之前立即将数据转换回可序列化数据类型。