将RuntimeTypeModel克隆到解冻状态?

时间:2012-07-20 14:30:57

标签: protobuf-net

是否可以从定义的模型中访问现有的序列化模型,然后为其附加一个合同但未知的子类型,然后将其用于序列化?

还是我需要明确创建一个新模型?即在这种情况下为ModuleTwoFoo


更新

var model = TypeModel.Create();
model[typeof(IFooChild)].AddSubType(2, typeof(ModuleTwoFooChild));
model.CompileInPlace();

RuntimeModel.Default [] // model []是访问... Doh

我唯一的抱怨,如果有的话...希望有一种方法可以访问原始模型,然后在其上构建而不是再次重新生成模型

正如marc所说,“基本上所需要的是克隆但未解冻的模型”


public interface IFoo
{
    int FooNumber { get; set; }
    IList<IFooChild> Children { get; set; }
}

[ProtoContract, ProtoInclude(1, typeof(ModuleOneFooChild))]
public interface IFooChild
{
    IFoo Foo { get; set; }
    string Detail { get; set; }
}

[ProtoContract]
public class ModuleOneFoo : IFoo
{
    [ProtoMember(1)]
    public int FooNumber { get; set; }

    [ProtoMember(2)]
    public IList<IFooChild> Children { get; set; }    
}

[ProtoContract]
public class ModuleOneFooChild : IFooChild
{
    public IFoo Foo { get; set; }

    [ProtoMember(1)]
    public string Detail { get; set; }    
}

[ProtoContract]
public class ModuleTwoFoo : IFoo
{
    [ProtoMember(1)]
    public int FooNumber { get; set; }

    [ProtoMember(2)]
    public IList<IFooChild> Children { get; set; }    
}

[ProtoContract]
public class ModuleTwoFooChild : IFooChild
{
    public IFoo Foo { get; set; }

    [ProtoMember(1)]
    public string Detail { get; set; }    
}

1 个答案:

答案 0 :(得分:1)

我假设您希望在生成序列化程序后对模型进行更改,这将包括添加子类型。目前尚不支持 - 当前时间您需要重新创建类型模型。您希望在开始使用之前知道您想要使用的内容!

但是,我可以看到两个功能请求之一的价值:

  1. 解冻MetaType(吹掉任何生成的序列化器/策略)
  2. 要克隆MetaType或RuntimeTypeModel,但不要冻结