Как сериализовать коллекцию классов, использующих переменные ссылочного типа? - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть абстрактный класс 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*/}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...