C# 如何序列化使用引用类型变量的类集合?

C# 如何序列化使用引用类型变量的类集合?,c#,unity3d,serialization,C#,Unity3d,Serialization,我有一个抽象的技能类,它提供了命令模式及其子类。我需要序列化技能实例的集合,然后反序列化并设置对其他类的一些实例的引用。 如何正确地执行此操作 除了创建技能映射器(每个子类型一个),然后创建where mapper is参数构造函数之外,我想不出其他解决方案。但在这种情况下,我不能以一般方式反序列化集合 [Serializable] public abstract class Skill : ICommand { [field: NonSerialized] public SkillItem

我有一个抽象的技能类,它提供了命令模式及其子类。我需要序列化技能实例的集合,然后反序列化并设置对其他类的一些实例的引用。 如何正确地执行此操作

除了创建技能映射器(每个子类型一个),然后创建where mapper is参数构造函数之外,我想不出其他解决方案。但在这种情况下,我不能以一般方式反序列化集合

[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();
}
[可序列化]
公共抽象类技能:ICommand
{
[field:NonSerialized]public SkillItemInfo Info{get;private set;}//Unity.ScriptableObject
[field:NonSerialized]public List SkillBlockers{get;private set;}//另一个限制使用当前技能的技能
公共技能(SkillItemInfo itemInfo,IEnumerable blocker){/*具体实现*/}
公开摘要无效适用();
公开摘要无效撤销();
}
[可序列化]
公开课技能:技能
{
[非序列化]引用类型A变量;
//……其他领域
公共SkillA(引用类型A变量、SkillItemInfo项目信息、IEnumerable阻止程序)
:base(itemInfo,blocker){/*具体实现*/}
//…一些方法
}
[可序列化]
公共课技能B:技能
{
[非序列化]引用类型B变量;
//……其他领域
公共SkillB(引用类型B变量、SkillItemInfo itemInfo、IEnumerable阻止程序)
:base(itemInfo,blocker){/*具体实现*/}
//…一些方法
}
[可序列化]
公共类技能集合
{
列表集合=新列表();
公共IEnumerable命令=>collection;
公共虚空添加(IEnumerable技能){/*具体实现*/}
公共无效清除(){/*具体实现*/}
}

技能类中的字段都是
[非序列化]
。。那么你打算序列化什么呢?我不打算序列化这个字段。这就是为什么它们被标记为[非序列化]。因为它们是引用类型。我需要在每次加载时从其他类更新这些类。例如,我提到的ItemInfo是一个可编写脚本的对象。我不打算序列化它。
[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*/}

}