Json Google Protobuf-类型注册表缺少描述符

Json Google Protobuf-类型注册表缺少描述符,json,protocol-buffers,google-protocol-buffer,Json,Protocol Buffers,Google Protocol Buffer,我有一些带有'@type'字段的Google Protobuf json,其值是一个URI,可以告诉某人它是什么类型的Protobuf消息,例如,“@type”:“type.googleapis.com/llcore.modemdatalas”。根据我的理解,这些json字符串应该首先序列化为“Any”类型。但无论何时执行此操作,都会出现以下错误: System.InvalidOperationException: Type registry has no descriptor for type

我有一些带有'@type'字段的Google Protobuf json,其值是一个URI,可以告诉某人它是什么类型的Protobuf消息,例如,
“@type”:“type.googleapis.com/llcore.modemdatalas”
。根据我的理解,这些json字符串应该首先序列化为“Any”类型。但无论何时执行此操作,都会出现以下错误:

System.InvalidOperationException: Type registry has no descriptor for type name ''llcore.ModemMessage'
这是我的密码:

string jsonString = "";
string jsonPath = @"C:\Users\user\Documents\TestRepos\ExampleProto\protoType.json";
using (StreamReader reader = new StreamReader(jsonPath))
{
    jsonString = reader.ReadToEnd();
}

Any anyProto = Any.Parser.ParseJson(msg); // Exception occurs here

有人知道如何正确地反序列化到任何类的Protobuf中吗?如何创建类型注册表并为其添加描述符?

首先,让我解释一下为什么不能简单地将任意JSON解析/序列化到
任何
(反之亦然)<代码>任何
本身有两个字段:

  • typeUrl
    -在您的例子中
    “type.googleapis.com/llcore.modemdatalas”
  • -编码为二进制协议的实际内容
二进制protobuf将每个字段编码为一对密钥和内容,就像一张地图一样。键不是字段的名称,而是原型定义中给定给字段的数字

JSON对象也是一个映射,但它使用字段名作为索引。因此,如果没有类型的任何类型信息(描述符),JSON解析器将不知道如何将JSON对象的命名字段映射到只由数字标识的二进制编码版本

只想说明一点:您无法解析/序列化编码为
Any
的未知类型!您的应用程序需要了解它们,可以通过静态地将描述符编译到其中,也可以通过在运行时查找类型描述符。这基本上是
TypeRegistry
的要点,它允许您在运行时加载描述符,但您必须自己提供查找类型的基础结构

要在您的情况下实现这一点,您的应用程序需要了解
Any
中打包的类型。然后您可以创建一个
TypeRegistry
,并将其传递给
JsonParser
构造函数。我不是一个
C
开发人员,而是一个大致如下的人:

var registry = TypeRegistry.FromMessages(MyMessage.Descriptor);
var parser = new JsonParser(new JsonParser.Settings(20, registry));
var message =  parser.Parse<Any>(payload);
var registry=TypeRegistry.FromMessages(MyMessage.Descriptor);
var parser=newjsonparser(newjsonparser.Settings(20,registry));
var message=parser.Parse(有效负载);