go - 两种不同语言之间的协议缓冲区
问题描述
我们将 Golang 和 .NET Core 用于我们的相互通信微服务基础架构。服务中的所有数据都基于我们创建的 Protobuffs 协议。这是我们的 Protobuffs 之一的示例:
syntax = "proto3";
package Protos;
option csharp_namespace = "Protos";
option go_package="Protos";
message EventMessage {
string actionType = 1;
string payload = 2;
bool auditIsActive = 3;
}
Golang 运行良好,服务根据需要生成内容并将其发送到 SQS 队列,一旦发生这种情况,.NET 核心服务将获取数据并尝试对其进行序列化。
以下是 SQS 消息示例的内容:
{"@type":"type.googleapis.com/Protos.EventMessage","actionType":"PushPayload","payload":"<<INTERNAL>>"}
但是我们得到一个例外,说电线类型未定义如下所述:
Google.Protobuf.InvalidProtocolBufferException: Protocol message contained a tag with an invalid wire type.
at Google.Protobuf.UnknownFieldSet.MergeFieldFrom(CodedInputStream input)
at Google.Protobuf.UnknownFieldSet.MergeFieldFrom(CodedInputStream input)
at Google.Protobuf.UnknownFieldSet.MergeFieldFrom(UnknownFieldSet unknownFields, CodedInputStream input)
at Protos.EventMessage.MergeFrom(CodedInputStream input) in /Users/maordavidzon/projects/github_connector/GithubConnector/GithubConnector/obj/Debug/netcoreapp3.0/EventMessage.cs:line 232
at Google.Protobuf.MessageExtensions.MergeFrom(IMessage message, Byte[] data, Boolean discardUnknownFields, ExtensionRegistry registry)
at Google.Protobuf.MessageParser`1.ParseFrom(Byte[] data)
两个服务中的 Proto 文件完全相同。
我们需要添加任何潜在的缺失选项或属性吗?
解决方案
看起来您使用的是 JSON 格式而不是二进制格式。在这种情况下,您想要ParseJson(string json)
,而不是ParseFrom(byte[] data)
。
注意:二进制格式更有效,如果这对您很重要。它还对 protobuf 库/工具有更好的支持。
推荐阅读
- java - 根据来自 Collectors.groupingBy(K, V) 的值将重复的 String n 次连接到自己身上
- javascript - 如何通过使用 remove 方法单击它来删除 javascript 中的图像
- python - 尝试通过 Bash mailx 命令从 Python 生成带有新行的电子邮件
- reactjs - React js hooks 总是落后一步
- asp.net-core - 通过调用以 .cshtml 结尾的页面进行 Razor 路由
- google-drive-api - 如何使用 python google drive api 将文件夹上传到共享的 google drive?
- arrays - 多个谷歌工作表按日期查询
- python - 从不同文件夹(祖先)运行脚本时的 Python 导入
- javascript - Bootstrap 折叠开始打开/折叠取决于 CheckBox 值
- stress-testing - 使用打乱图像的 K6 压力测试