Everything is simple and difficult at the same time :)
The matter is that in Unity you see not the assets themselves, but their versions deserialized from the disk. Overwriting data on a disk is performed when you click Save Project, and restarting after stopping PlayMode or after compiling the project code.
This is just an explanation of why your type falls off at precisely these moments.
And now, actually, why it falls off at all - List<Item> items
The fact is that when serializing with the base means of Unity of such a sheet on a disk, only data that corresponds to the base class is recorded. If you open the .asset file with a text editor, you will see for yourself.
As a result, when you reload the data you get a list of basic items.
There are actually two exits here (of those that immediately come to mind) - to separate lists, or to store pairs - a key-data. Those. Your list will contain something like these classes:
class DataPair { public string Type; //тут хранится, например, typeof(EquippableItem).ToString() public string Json; //а тут JsonUtility.ToJson(addEquippableItem) }
And when you start to draw your violin object, or run a runtime, convert this data into objects. Well, the ISerializationCallbackReceiver interface can help . It allows you to catch events related to serialization.