gpt4 book ai didi

network-protocols - protobuf-net v2 类型元

转载 作者:行者123 更新时间:2023-12-02 02:24:14 26 4
gpt4 key购买 nike

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

Type meta

The serialization is fine, but I don’t know (and cannot know) all of my types up front. How can I do this?

嗯,protobuf 是一种基于契约的格式;如果你不知道 类型,它会很挣扎——任何基于契约的序列化程序都会如此……

Yes, I get that; now: how do I do it?

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

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

最佳答案

这里的技巧是在您的对象的成员上使用 DynamicType = true 选项 - 作为一个过度简化的示例:

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

返回“string<===>Type map”,即 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);
}

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

关于network-protocols - protobuf-net v2 类型元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6702172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com