当前位置: 首页 > 知识库问答 >
问题:

尝试发布使用协议缓冲区序列化的数据在序列化时失败

荣轶
2023-03-14

尝试使用Google的协议缓冲区序列化对象时,我遇到以下错误:

类型不是预期的,也不能推断出合约:

我有三个项目:

  1. 具有*的DotNet Standard 2.0库项目。原始文件

该库包含一个*。原型文件。它包含几个不同的消息对象,每个对象的属性要么是字符串,要么是int32。有两个“包装器”对象,一个名为Request(请求)(另一个名为Response)。没有什么明显复杂的事情。

此库的NuGet包是:

<PackageReference Include="Google.Protobuf" Version="3.17.3" />
<PackageReference Include="Grpc" Version="2.40.0" />
<PackageReference Include="Grpc.Tools" Version="2.40.0">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

可能有些是不必要的......

所以我的想法是。NET 4.8 WebAPI将接收请求对象(即协议文件中定义的类之一),然后返回响应对象(也在协议文件中定义)。

然而我的测试在有机会对WebAPI进行Http调用之前就失败了。。。

我的。NET 5测试项目具有以下NuGet包:

<PackageReference Include="protobuf-net" version="3.0.101" />

它还有一个包引用到我的。NET标准库(因此了解请求和响应,以及它拥有的NuGet包)。

在我的测试中,我创建了一个新的请求对象(来自proto文件中定义的命名空间SomeNamespace),并填充它的属性。

然后,我尝试使用以下方法对其进行序列化:

using MemoryStream stream = new();
ProtoBuf.Serializer.Serialize<Request>(stream, objectToBeSerialized);

这就是错误发生的地方:

系统InvalidOperationException HResult=0x80131509消息=不应为类型,并且无法推断任何约定:SomeNamespace。请求源=protobuf net。堆芯堆叠轨迹:在ProtoBuf。内部的ThrowHelper。//src/protobuf net中的ThrowInvalidOperationException(字符串消息,异常内部异常)。核心/内部/ThrowHelper。cs:ProtoBuf第56行。元。类型型号。通过//src/protobuf net中的透视类型(Type Type,TypeModel model)。核心/元/类型模型。cs:ProtoBuf的1648号线。元。类型型号。SerializeRootFallback(状态

我不清楚为什么这可能会失败。

理想情况下,我想对最佳实践进行标准化,所以如果我没有使用理想的NuGet包,请告诉我。

共有1个答案

冀冯浩
2023-03-14

在protobuf中,使用时。proto,涉及两套工具:

  1. 模式解析器/代码生成器

现在,我们还需要知道的是,protobuf在中有多个实现。净土地;与这个问题相关的是Google实现和protobuf net(还有其他一些,但它们与这个问题无关)。

我认为您所做的是:您在步骤1(“protoc”)中使用了Google工具,但在步骤2中使用了protobuf net。1和2的工具需要匹配:谷歌和谷歌都很好;protobuf网和protobuf网很好,但不能交叉。

所以,要么:

a.使用Google运行时库而不是Pro buf-net(“Google. Pro buf”,作为一个nuget包),或者b:使用Pro buf-net的模式工具和代码gen(参见https://protobuf-net.github.io/protobuf-net/contract_first.html,包括底部的链接以获取其他选项)

如果我的直觉是正确的,请让我知道-我会努力让protobuf net认识到这种情况,并至少提供适当的指导

 类似资料:
  • 这就是我想要实现的: > 在Proc#1中使用google协议缓冲区建模对象 使用proto-buf序列化该对象,并将其发送到posix消息队列。 在Proc#2中读取流并将其反序列化为类似的模型,同时使用协议缓冲区。 换句话说: 进程1中的对象-- 问题是Proc#1和Proc#2可能是完全不同的语言平台。程序#1通常是C与g相一致的。但是Proc#2可以是任何东西:Python、Java等等。

  • 是否有可能在C中序列化一个类,并使用协议缓冲区将其反序列化为C#中的类似类?我已经尝试过Json序列化来克服不同平台中的序列化问题,但它在一些数据类型上存在问题,如数组列表等。那么关于使用谷歌协议缓冲区有什么建议吗?

  • 我有kafka集群接收消息。消息是一个字节数组的zip文件。zip文件包含二进制的原型数据文件作为条目。我正在读取zip文件,并试图反序列化的原型条目,这就是我的代码是打异常。 在将二进制protobuf文件作为压缩字节数组发送到代理之前,我能够对其进行反序列化。 但是,当我压缩这些二进制protobuf文件,向kafka生成消息,使用它,然后尝试反序列化zip流中的条目时,我面临着一些问题。 我

  • 默认情况下,Dart-RPC在服务器和客户端之间传输对象(类实例)时使用JSON序列化。 如何使用Protobuf(协议缓冲区)序列化 是否可以使用“接受”请求标头指定序列化方法(如内容类型)? 这是我尝试的, 我使用了以下定义文件,表示实体: 生成了人。pb。dart对于我来说,使用protoc gen dart插件,通过运行以下命令: 还有一些样板dart rpc代码: 打开功能请求:http

  • SOFARPC 可以在使用 Bolt 通信协议的情况下,可以选择不同的序列化协议,目前支持 hessian2 和 protobuf。 默认的情况下,SOFARPC 使用 hessian2 作为序列化协议,如果需要将序列化协议设置成 protobuf,在发布服务的时候,需要做如下的设置: <sofa:service ref="sampleService" interface="com.alipay.

  • 场景:阿帕奇·Flink、Kafka、协议缓冲区数据消费者。 数据源是协议缓冲区格式的Kafka主题(多个主题:主题#1,主题#3,主题#3)。消费者是Apache Flink消费者。每个主题都有一个独特的原型定义。 我试图在Apache Flink中开发一个通用的数据摄取工作,将Kafka的数据摄取到数据库中。 如何为Apache Flink实现通用protobuf反序列化程序?我正在寻找实现,