继承在运行时在protobuf-net中解决

|| 是否可以在运行时指定特定抽象合同的子类型? 在经典的WCF / DataContract中,我们具有KnownTypeAttribute及其构造函数,该函数接受表示要调用的静态函数名称的字符串,以获取一组Type:s。
[DataContract]
[KnownType(\"GetTypes\")]
public abstract class AbstractContract
{
    [DataMember] public int Prop1 { get; set; }
    [DataMember] public string Prop2 { get; set; }

    static IEnumerable<Type> GetTypes()
    {
        var list = new List<Type>();
        list.Add(typeof(ConcreteContract1));
        list.Add(typeof(ConcreteContract2));

        return list;
    }
}

[DataContract]
public class ConcreteContract1 : AbstractContract
{
    [DataMember] public int Prop3 { get; set; }
}

[DataContract]
public class ConcreteContract2 : AbstractContract
{
    [DataMember] public bool Prop3 { get; set; }
}
是否支持这种情况?     
已邀请:
不支持带有
GetTypes()
的方案,部分原因是v1如何处理生成/缓存-但是,在v2中(可提供预览),这是可支持的:
using System;
using System.Runtime.Serialization;
using ProtoBuf.Meta;

class Program
{
    static void Main()
    {
        var model = TypeModel.Create();
        var abst = model.Add(typeof(AbstractContract), true);
        // define inheritance here...
        abst.AddSubType(10, typeof(ConcreteContract1));
        abst.AddSubType(11, typeof(ConcreteContract2));
        model.CompileInPlace();

        AbstractContract foo = new ConcreteContract1 { Prop1 = 123, Prop2 = \"abc\", Prop3 = 456 };
        AbstractContract bar = (AbstractContract)model.DeepClone(foo);

        Console.WriteLine(bar.Prop1);
        Console.WriteLine(bar.Prop2);
        Console.WriteLine(((ConcreteContract1)bar).Prop3);
    }
}



[DataContract]
public abstract class AbstractContract
{
    [DataMember(Order=1)]
    public int Prop1 { get; set; }
    [DataMember(Order=2)]
    public string Prop2 { get; set; }
}

[DataContract]
public class ConcreteContract1 : AbstractContract
{
    [DataMember(Order=1)]
    public int Prop3 { get; set; }
}

[DataContract]
public class ConcreteContract2 : AbstractContract
{
    [DataMember(Order=1)]
    public bool Prop3 { get; set; }
}
实际上,通过这种方法,您可以根据需要删除所有属性(而是明确地告诉它)。注意:您应该尽可能地缓存并重用已编译的模型-这是线程安全的,但是每次生成它都会更昂贵。     

要回复问题请先登录注册