using System; using UnityEngine; using UnityObject = UnityEngine.Object; namespace Unity.VisualScripting.FullSerializer { #if !UNITY_EDITOR && UNITY_WSA // For System.Reflection.TypeExtensions using System.Reflection; #endif /// /// Extend this interface on your type to receive notifications about /// serialization/deserialization events. If you don't have access to the /// type itself, then you can write an fsObjectProcessor instead. /// public interface fsISerializationCallbacks { /// /// Called before serialization. /// void OnBeforeSerialize(Type storageType); /// /// Called after serialization. /// /// /// The field/property type that is storing the instance. /// /// The data that was serialized. void OnAfterSerialize(Type storageType, ref fsData data); /// /// Called before deserialization. /// /// /// The field/property type that is storing the instance. /// /// /// The data that will be used for deserialization. /// void OnBeforeDeserialize(Type storageType, ref fsData data); /// /// Called after deserialization. /// /// /// The field/property type that is storing the instance. /// /// The type of the instance. void OnAfterDeserialize(Type storageType); } public class fsSerializationCallbackProcessor : fsObjectProcessor { public override bool CanProcess(Type type) { return typeof(fsISerializationCallbacks).IsAssignableFrom(type); } public override void OnBeforeSerialize(Type storageType, object instance) { // Don't call the callback on null instances. if (instance == null) { return; } ((fsISerializationCallbacks)instance).OnBeforeSerialize(storageType); } public override void OnAfterSerialize(Type storageType, object instance, ref fsData data) { // Don't call the callback on null instances. if (instance == null) { return; } ((fsISerializationCallbacks)instance).OnAfterSerialize(storageType, ref data); } public override void OnBeforeDeserializeAfterInstanceCreation(Type storageType, object instance, ref fsData data) { if (instance is fsISerializationCallbacks == false) { throw new InvalidCastException("Please ensure the converter for " + storageType + " actually returns an instance of it, not an instance of " + instance.GetType()); } ((fsISerializationCallbacks)instance).OnBeforeDeserialize(storageType, ref data); } public override void OnAfterDeserialize(Type storageType, object instance) { // Don't call the callback on null instances. if (instance == null) { return; } ((fsISerializationCallbacks)instance).OnAfterDeserialize(storageType); } } #if !NO_UNITY public class fsSerializationCallbackReceiverProcessor : fsObjectProcessor { public override bool CanProcess(Type type) { return typeof(ISerializationCallbackReceiver).IsAssignableFrom(type); } public override void OnBeforeSerialize(Type storageType, object instance) { // Don't call the callback on null instances. if (instance == null || instance is UnityObject) { return; } ((ISerializationCallbackReceiver)instance).OnBeforeSerialize(); } public override void OnAfterDeserialize(Type storageType, object instance) { // Don't call the callback on null instances. if (instance == null || instance is UnityObject) { return; } ((ISerializationCallbackReceiver)instance).OnAfterDeserialize(); } } #endif }