У меня есть абстрактный класс Skill, который предоставляет шаблон Command и его потомков. Мне нужно сериализовать коллекцию экземпляров Skill, а затем десериализовать и установить ссылки на некоторые экземпляры других классов. Как мне сделать это правильно?
Я не могу придумать иного решения, кроме создания карт умений (по одному для каждого дочернего типа) и последующего создания конструктора аргументов where. Но в этом случае я не могу десериализовать коллекцию в общем виде c.
[Serializable]
public abstract class Skill : ICommand
{
[field: NonSerialized] public SkillItemInfo Info { get; private set; } // Unity.ScriptableObject
[field: NonSerialized] public List<ISkill> SkillBlockers { get; private set; }// Another skills that restrict to use current
public Skill(SkillItemInfo itemInfo, IEnumerable<ISkill> blocker){/*concrete realisation*/}
public abstract void Apply();
public abstract void Undo();
}
[Serializable]
public class SkillA: Skill
{
[NonSerialized]ReferenceTypeA variable;
// ... other fields
public SkillA(ReferenceTypeA variable, SkillItemInfo itemInfo, IEnumerable<ISkill> blocker)
:base(itemInfo, blocker) {/*concrete realisation*/}
//... Some methods
}
[Serializable]
public class SkillB: Skill
{
[NonSerialized]ReferenceTypeB variable;
// ... other fields
public SkillB(ReferenceTypeB variable, SkillItemInfo itemInfo, IEnumerable<ISkill> blocker)
:base(itemInfo, blocker) {/*concrete realisation*/}
//... Some methods
}
[Serializable]
public class SkillCollection
{
List<Skill> collection = new List<Skill>();
public IEnumerable<ICommand> Commands => collection;
public void Add(IEnumerable<Skill> skill){/*concrete realisation*/}
public void Clear(){/*concrete realisation*/}
}