【问题标题】:protobuf-net v2 type metaprotobuf-net v2 类型元
【发布时间】:2011-10-05 20:11:25
【问题描述】:

根据this 的帖子(从 3 月开始),protobuf v2 允许我们从流中解析类型。由于 v2 现在是 beta 5,我认为这个功能已经实现了,所以我想知道如何使用这个新功能。我还没有找到任何关于它的文档,所以非常感谢一些帮助!

类型元

序列化很好,但我不知道(也不能知道)所有 我的类型在前面。我该怎么做?

好吧,protobuf 是一种基于合约的格式;如果你不知道 类型,它会很困难 - 任何基于合约的序列化器......

是的,我明白了;现在:我该怎么做?

现在,出于各种原因,我推迟了将任何元数据放入流中:

它远远超出了核心 protobuf 规范,它会闪烁警告 BinaryFormatter 的迹象,我的克星 但是,似乎有很多人想要 我认为我必须扣上这个;但以我的条件!所以在 v2 中,我是 添加指示(基于每个成员)对象的能力 应该从流中解析它们的类型信息。默认情况下,由 嵌入程序集限定名称,但提供抽象 覆盖它允许您提供自己的字符串类型映射 (从而避免因类型过多引起的胃部打结 依赖)。

【问题讨论】:

    标签: network-protocols protocol-buffers protobuf-net


    【解决方案1】:

    这里的诀窍是在一个成员上使用DynamicType = true 选项你的对象 - 作为一个过于简单的例子:

    [ProtoMember(12, DynamicType = true)]
    public object CouldBeAnything {get;set;}
    

    关于“字符串类型映射”,即TypeModel 上的DynamicTypeFormatting 事件。如果您使用Serializer.* 方法,那是RuntimeTypeModel.Default 序列化程序实例的快捷方式(主要用于保留v1 API)。

    (作为旁注,在写这篇文章时,我确实注意到了一个需要在代码中修复的边缘情况)

    注意:这里的另一种方法,而不是使用DynamicType,是简单地在运行时配置模型,例如:

    var knownTypes = GetMyKnownTypesAtRuntimeWithUniqueIdentifiers();
    var metaType = typeModel[typeof(MyBaseClass)];
    foreach(var knownType in knownTypes)
    {
        metaType.AddSubType(knownType.UniqueIdentifier, knownType.Type);
    }
    

    IMO,后者是我的首选选项,通常效率更高。请注意,唯一标识符必须是固定的/可重复的,因为这是有线格式的一部分(不要只使用找到它们的顺序的索引)。

    【讨论】:

    • 这是我能找到的唯一一个解释如何在运行时配置模型的地方。谢谢你,马克。
    • @MarcGravell DynamicType 的元数据是否与 protobuf 的 DymanicMessage 兼容。
    • @Logan 没有;不同的概念,具有令人讨厌的相似命名选择
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    相关资源
    最近更新 更多