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

问题描述 投票:1回答:2

我们正在将Golang和.NET Core用于我们的互通信微服务基础架构。服务中的所有数据都基于我们创建的Probuffs协议。这是我们一个原型的例子:

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文件完全相同。

是否需要添加任何可能缺少的选项或属性?

go .net-core protocol-buffers grpc protobuf-net
2个回答
1
投票

似乎您使用的是JSON格式,而不是二进制格式。在这种情况下,[您想要ParseJson(string json),而不是ParseFrom(byte[] data)(https://developers.google.com/protocol-buffers/docs/reference/csharp/class/google/protobuf/message-parser)。

注意:如果对您而言,二进制格式更有效。它还对protobuf库/工具提供了更好的支持。


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.