C# 使用protobuf net反序列化未知对象,了解模式

C# 使用protobuf net反序列化未知对象,了解模式,c#,protobuf-net,C#,Protobuf Net,我必须解析未知类型的返回消息,由protobuf net序列化 我已经成功地从原始字节解析回FileDescriptorSet,我的意思是我知道类型名称,它的字段等等。但是如何在不知道它的类型的情况下反序列化消息呢?Marc的答案很接近,但我不明白如何使用可扩展类 您可能需要创建一个非抽象类来使用,但是 Foo:那么,可扩展的{}就足够了 序列化程序。反序列化(源) 所以我没有“Foo”,我只有FileDescriptorSet和消息的序列化字节。我需要用代码“在飞行中”完成它。如何将FileD

我必须解析未知类型的返回消息,由protobuf net序列化

我已经成功地从原始字节解析回FileDescriptorSet,我的意思是我知道类型名称,它的字段等等。但是如何在不知道它的类型的情况下反序列化消息呢?Marc的答案很接近,但我不明白如何使用可扩展类

您可能需要创建一个非抽象类来使用,但是 Foo:那么,可扩展的{}就足够了 序列化程序。反序列化(源)

所以我没有“Foo”,我只有FileDescriptorSet和消息的序列化字节。我需要用代码“在飞行中”完成它。如何将FileDescriptorSet与包含未知消息类型值的字节数组相结合?

这个问题没有简单的答案,我还没有必要完全实现一个示例。在这里,可扩展的为我们做的唯一一件事就是允许基本访问仍以字节形式存储的特殊字段。因此:您可以从数据源反序列化一个
可扩展的
,然后使用
可扩展的.GetValue(obj,fieldNumber)
和该API的相关重载。您需要根据自己对正在查看的
DescriptorProto
的解释来执行此操作(
DescriptorProto
FileDescriptorSet
中的类型)。例如,您可以枚举
.Fields
,并为每个字段:从
.type
.TypeName
中推断出一些
(您必须将其解析为另一个
描述符proto
枚举描述符proto
等),以及
.Number
(用于标记)。对于任何消息类型,您都可以再次使用
可扩展
,并递归地重复该过程。您还需要检查
.Label
是否重复,如果重复,请改用
Extensible.GetValues


这就是理论。我没有必要把它付诸实践。

除了反序列化之外,我几乎什么都懂。如果我尝试使用Serializer.Deserialize(输入\消息\字节);它给了我一个异常“类型不是预期的,并且不能推断任何契约:”。要使用GetValue方法,我必须以某种方式获取可扩展实例。@Michael
[ProtoContract]公共密封类改用this:Extensible{}