根据this帖子(从3月开始),protobuf v2允许我们从流中解析类型。由于v2现在处于测试版5,我认为这个功能已经实现,所以我想知道如何使用这个新功能。我无法找到任何关于它的文档,所以非常感谢一些帮助!
输入meta
序列化很好,但我不知道(也不知道)所有的 我的类型在前面。我怎么能这样做?
嗯,protobuf是一种基于合同的格式;如果你不知道 类型,它会很困难 - 就像任何基于合同的序列化器一样......
是的,我明白了;现在:我该怎么做?
现在,由于各种原因,我暂时不会在流中添加任何元数据:
它远远超出核心protobuf规范,它会闪烁警告 BinaryFormatter的迹象,我的克星但是,很多人似乎都想要 这就是我认为我必须扣;但按我的条件!所以在v2中,我是 添加指示(基于每个成员)对象的能力 应从流中解析其类型信息。默认情况下,由 嵌入程序集限定名称,但提供抽象 图层覆盖,允许您提供自己的字符串< ===>类型图 (从而避免过多类型引起的胃结 依赖性)。
答案 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后者是我的首选选项,通常效率更高。请注意,唯一标识符必须是固定/可重复的,因为它是有线格式的一部分(不要只使用您找到它们的顺序的索引)。