I’ve been breaking my head over this the past 2 days, and since I found no information about it in the forums, documentation or google, I decided to post it here.
Suppose you the following 2 classes:

This is something valid and will not present any problems at all, it will even display in the editor if Class 2 is serializable.
Now, suppose the following scenario:

taking in consideration that Class2 is abstract, MethodX is abstract, Class1 stores one instance of either Class3 or Class4 but as their supertype Class2 and finally there is a Factory class somewhere else that is in charge to instaciate the Concrete types Class3 and Class4 depending on any trivial value.
Again, this setup is valid and will work, the only issue I find here is that Unity Editor will only display the values present in Class2 and not any other present in either Class3 or Class4, but that’s not a problem. If Class1 called MethodX in its property it will call the proper method in the corresponding concrete class. So far this is beautiful from my viewpoint.
----------------- From Here the bug Part----------------------------
As mentioned above, the fore mentioned set up works as expected, but now if we go and save the scene and the project, and close the program, and go and open the program (Unity) and the project again, and get to the point of executing the Class1 script up to the point where it invokes MethodX from its previously instantiated attribute, we will find for our surprise that the type of the attribute was restored as the abstract type and no longer as any of the concrete types, even worse, if we continue debugging or executing, Unity will crash and close after trying to execute MethodX (My Theory is that unity is trying to execute the abstract Method in the base class that is not implemented). I Hope this was clear enough. Is this really a bug? or am I missing something? I know that classes that inherit from Monobehaviour can’t be abstract or static or sealed, but I can’t find any document that says that those are not supported. If it’s a bug, is there any workaround besides not using abstract classes?. As a final note, if you use virtual methods and override them, the same happens, this time Unity will not crash, but it will call the Method in the parent instead of the one in the child.