为了账号安全,请及时绑定邮箱和手机立即绑定

两种不同语言之间的协议缓冲区

两种不同语言之间的协议缓冲区

Go
手掌心 2022-04-20 19:27:27
我们将 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 文件完全相同。我们需要添加任何潜在的缺失选项或属性吗?
查看完整描述

2 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

看起来您使用的是 JSON 格式而不是二进制格式。在这种情况下,您想要ParseJson(string json),而不是ParseFrom(byte[] data)

注意:二进制格式更有效,如果这对您很重要。它还对 protobuf 库/工具有更好的支持。


查看完整回答
反对 回复 2022-04-20
?
倚天杖

TA贡献1828条经验 获得超3个赞

基本上有两种可能的情况,或者您为 .NET 和 GoLang 生成的 protos 文件不在同一版本中,或者您的数据在 GoLang 和 .NET 应用程序之间传输时已损坏。

Protobuf 是一个二进制协议,请检查您是否有任何 http 过滤器或其他任何可以更改传入或传出字节流的东西。


查看完整回答
反对 回复 2022-04-20
  • 2 回答
  • 0 关注
  • 219 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信