如何使用 RuntimeTypeModel 将 ProtoInclude 与 protobuf-net 中的类型相关联?

Posted

技术标签:

【中文标题】如何使用 RuntimeTypeModel 将 ProtoInclude 与 protobuf-net 中的类型相关联?【英文标题】:How RuntimeTypeModel can be used to associate ProtoInclude with a type in protobuf-net? 【发布时间】:2011-05-22 12:41:51 【问题描述】:

据我了解,RuntimeTypeModel 允许将 ProtoInclude 与类型相关联,这对于无法更改类型声明的情况很有用。但我很难理解它实际上是如何完成的。

有例子吗?

谢谢。

【问题讨论】:

【参考方案1】:

AddSubType() 用于指定派生类型及其标识符;例如(full code):

    static RuntimeTypeModel CreateModel() 
        var model = TypeModel.Create();
        model[typeof(NotInvolved)].Add(1, "D");
        model[typeof(SomeBase)]
            .Add(1, "A")
            .AddSubType(2, typeof(SomeDerived))
            .AddSubType(3, typeof(AnotherDerived));
        model[typeof(SomeDerived)].Add(1, "B");
        model[typeof(AnotherDerived)].Add(1, "C");
        model[typeof(AlsoNotInvolved)].Add(1, "E");
        return model;
    

以上在运行时配置了整个类型模型,但您也可以在自动(通过属性)和显式(通过代码)之间混合搭配。

【讨论】:

+1 @Marc Gravell:那么我们应该从那里使用 model.Serialize 和 model.Deserialize 而不是 ProtoBuf.Serializer.De/serialize?另外,在您的示例中,AnotherDerived 是否派生自 SomeBase? @sgtz 肯定是的,而且是从记忆中得出的。按此顺序。

以上是关于如何使用 RuntimeTypeModel 将 ProtoInclude 与 protobuf-net 中的类型相关联?的主要内容,如果未能解决你的问题,请参考以下文章

将 protobuf-net RuntimeTypeModel 编译为 C#,而不是 DLL

从 protobuf-net 中的自定义 RuntimeTypeModel 生成 .proto 文件

Protobuf-net RuntimeTypeModel 不序列化基类的成员

protobuf-net - 列出支持的类型

如何以编程方式确定类型是不是可以通过 protobuf-net 本地序列化?

如何使用终端将 .p12 文件转换为 .pem 文件?