Custom ScriptableObject asset gets messed up

I’ve written a custom asset, with accompanying custom inspector and so on. What I’m seeing is that while it works fine most of the time, it often gets into a weird state where the asset still seems to work (based on the objects that reference and use it) but the inspector stops showing up.

The asset is a ScriptableObject, and also implements the IList interface:

public class AnimTable : ScriptableObject, IList<AnimTableEntry>
{
    private Dictionary<string, AnimTableEntry> _dict;
    [SerializeField] private List<AnimTableEntry> _list;

    public AnimTableEntry this[string groupName]
    {
        get
        {
            AnimTableEntry result;
            if (_dict.TryGetValue(groupName, out result)) return result;
            throw new KeyNotFoundException("Animation group \"" + groupName +
                                           "\" is not present in this animation table.");
        }
    }

   /* ... IList<AnimTableEntry> members ... */

  public void RebuildDictionary()
    {
        _dict = new Dictionary<string, AnimTableEntry>(_list.Count);
        foreach (AnimTableEntry e in _list)
            _dict.Add(e.GroupName, e);
    }

    public void OnEnable()
    {
        if (_list == null)
            _list = new List<AnimTableEntry>();

        RebuildDictionary();
    }
}

One thing is that AnimTableEntry includes some AnimationClip members, and when the asset stops working in the inspector, it also suddenly starts displaying a bunch of AnimationClip children in the Project view.

Broken assets still show up in the asset browser and can be selected and work OK, so Unity clearly still knows that it is an asset of the appropriate type.

If I put a Debug.Log() line in the beginning of OnInspectorGUI() for the custom editor, it doesn’t even get called, so I’m thinking that Unity is for some reason deliberately not calling my inspector. (It does get called for newly-created assets).

Anyone know why this is happening, and how to stop it? At the moment I’m working around it by deleting and regenerating the asset every time it happens, but it’s getting pretty tedious having to rewire everything over and over.