Deep Copy ScriptableObject

I’ve been trying to clone a ScriptableObject with the following script:

public static class ObjectCopier
{
    /// <summary>
    /// Perform a deep Copy of the object.
    /// </summary>
    /// <typeparam name="T">The type of object being copied.</typeparam>
    /// <param name="source">The object instance to copy.</param>
    /// <returns>The copied object.</returns>
    public static T Clone<T>(T source)
    {
        if (!typeof(T).IsSerializable)
        {
            throw new ArgumentException("The type must be serializable.", "source");
        }

        // Don't serialize a null object, simply return the default for that object
        if (object.ReferenceEquals(source, null))
        {
            return default(T);
        }

        IFormatter formatter = new BinaryFormatter();
        Stream stream = new MemoryStream();
        using (stream)
        {
            formatter.Serialize(stream, source);
            stream.Seek(0, SeekOrigin.Begin);
            return (T)formatter.Deserialize(stream);
        }
    }
}  

But it is producing this error:

SerializationException: Type UnityEngine.ScriptableObject in assembly UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null is not marked as serializable.

How can we perform a deep copy in this case?

Just a hunch, but does Object.Instantiate create a deep copy for your object?

I think this editor method may help you: EditorUtility.CopySerialized, I tried it, and it worked.

Just in case this is useful for others.

EditorUtility.CopySerialized does not work on iOS.

However, making your objects ScriptableObject then Instantiating the object does work.