protobuf-net v2 type meta

时间:2011-07-15 02:44:20

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

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

  

输入meta

     
    
      

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

    
  
     

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

     
    
      

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

    
  
     

现在,由于各种原因,我暂时不会在流中添加任何元数据:

     

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

1 个答案:

答案 0 :(得分:2)

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

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

重新设置“字符串< ===>类型地图”,即DynamicTypeFormatting上的TypeModel事件。如果您使用的是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后者是我的首选选项,通常效率更高。请注意,唯一标识符必须是固定/可重复的,因为它是有线格式的一部分(不要只使用您找到它们的顺序的索引)。