2

カスタム EntityData クラスを Eyeshot 独自のファイル形式にシリアル化しようとしています。これについてはすばらしい記事があります ( https://devdept.zendesk.com/hc/en-us/articles/360003318873-Eyeshot-Proprietary-File-Format )
。基本クラスから派生したクラスをシリアル化します。これがサンプルです。できるだけ小さくするようにしました(途中でコメントを読んでください):

public class BaseClass
{
    public int Id { get; set; }
    public virtual BaseClassSurrogate ConvertToSurrogate() { return new BaseClassSurrogate(this); }
}
public class BaseClassSurrogate : Surrogate<BaseClass>
{
    public BaseClassSurrogate(BaseClass myBaseClass) : base(myBaseClass) { }
    public int Id { get; set; }
    protected override BaseClass ConvertToObject()
    {
        var baseClass = new BaseClass();
        CopyDataToObject(baseClass);
        return baseClass;
    }
    protected override void CopyDataFromObject(BaseClass obj) { Id = obj.Id; }
    protected override void CopyDataToObject(BaseClass obj) { obj.Id = this.Id; }
    public static implicit operator BaseClass(BaseClassSurrogate surrogate) { return surrogate?.ConvertToObject(); }
    public static implicit operator BaseClassSurrogate(BaseClass source) { return source?.ConvertToSurrogate(); }
}

そして、その代理実装を持つ私の派生クラス:

public class DerivedClass : BaseClass
{
    public int Number { get; set; }
    public override BaseClassSurrogate ConvertToSurrogate() { return new DerivedClassSurrogate(this); }
}

public class DerivedClassSurrogate : BaseClassSurrogate
{
    public DerivedClassSurrogate(DerivedClass baseClass) : base(baseClass) { }
    public int Number { get; set; }
    protected override BaseClass ConvertToObject()
    {
        var derivedClass= new DerivedClass();
        CopyDataToObject(derivedClass);
        return derivedClass;
    }
    protected override void CopyDataFromObject(BaseClass obj)
    {
        if (obj is DerivedClass derivedClass)
            Number = derivedClass.Number;
        base.CopyDataFromObject(obj);
    }
    protected override void CopyDataToObject(BaseClass obj)
    {
        if (obj is DerivedClass derivedClass)
            derivedClass.Number = Number;
        base.CopyDataToObject(obj);
    }
    //I don't understand do I need to call these in derived class as well?
    //public static implicit operator BaseClass(BaseClassSurrogate surrogate) { return surrogate?.ConvertToObject(); }
    //public static implicit operator BaseClassSurrogate(BaseClass source) { return source?.ConvertToSurrogate(); }
}

クラスのFillModelメソッドは次のとおりです。FileSerializer

protected override void FillModel()
{
    base.FillModel();

    Model.Add(typeof(BaseClass), false)
         .SetSurrogate(typeof(BaseClassSurrogate));

    MetaType mt1 = Model[typeof(BaseClassSurrogate)]
        .Add(1, "Id");

    mt1.SetCallbacks(null, null, "BeforeDeserialize", null); 
    mt1.UseConstructor = false; 

    Model.Add(typeof(DerivedClass), false)
    .SetSurrogate(typeof(DerivedClassSurrogate));

    MetaType mt2 = Model[typeof(DerivedClassSurrogate)]
        .Add(1, "Number");

    mt2.SetCallbacks(null, null, "BeforeDeserialize", null); 
    mt2.UseConstructor = false;
}

このコードでは、「サロゲート DerivedClass/DerivedClassSurrogate に適した変換演算子が見つかりません」というエラーが表示されます。どんな助けでも大歓迎です。

4

1 に答える 1