Can’t serialize custom class variable in ScriptableObject.Or add instance of a class to a list with overridden method in custom editor.

I’m making simple inventory system. I got a class for an Item

public class Item 
    public string itemName;
    public int itemId;
    //some more variables
    public Effect itemEffect;
    //some more code
public void Use(Entity x)

All the items are stored in the list inside ScriptableObject with a custom editor.
The best way of implementing item effect I came up with is this. Every item has method “Use” which is calling “UseEffect” method of itemEffect variable which is an instance of Effect class
This is the Effect class.

public class Effect 
    public string effectName;
    public Effect ()
        this.effectName = "BaseEffect";

    public virtual void UseEffect (SomeParameter x)
        Debug.Log("This  is base effect"+ x.Something.ToString());

This is my Test Effect derived from Effect class

public class TestEffect: Effect
    public TestEffect()
        this.effectName = "TestEffect";
    public override void UseEffect(SomeParameter x) 
        Debug.Log("This is TEST EFFECT");
        x.something = x.something+1;

This is how i assign TestEffect object to Item variable i custom editor.

 if (GUI.Button(//someRect,"Apply test effect to test item"))
          //Item_Database_Asset is the ScriptableObject  with Items_Database_List of all items                           
          Item_Database_Asset.Items_Database_List[1].itemEffect = new TestEffect();;

So the problem is after i click “Apply test effect to test item” when i press play and using this item it’s calling UseEffect of BaseEffect. Although in inspector i see that item[1] itemEffect.effectName is TestEffect. So is basically working but it’s still calling BaseEffect.
But if i click “Apply test effect to test item” on runtime in play mode it works fine.
It’s a bit long and convoluted.I hope it’s readable.
Thank you.

Unity has no polymorphism support for custom serialized classes. Read the documentation about serialization. Especially the part:

When might the serializer behave

Custom serialized classes are mainly meant to be data containers. The serializer serializes custom classes based on the variable type, not the actual type.