gpt4 book ai didi

c# - 谷歌.Protobuf.InvalidProtocolBufferException : Protocol message contained an invalid tag (zero)

转载 作者:太空狗 更新时间:2023-10-29 23:28:46 66 4
gpt4 key购买 nike

我的学校项目有问题,我使用 Protobuf 库但出现以下错误:

Google.Protobuf.InvalidProtocolBufferException" Protocol message contained an invalid tag (zero).

我的协议(protocol)消息包装器是:

syntax = "proto3";
package CardGameGUI.Network.Protocol.Message;

message WrapperMessage {
enum MessageType {
HELLO_MESSAGE = 0;
JOIN_ROOM_MESSAGE = 1;
JOIN_ROOM_RESPONSE_MESSAGE = 2;
}

MessageType type = 1;
bytes payload = 2;
}

我用它来发送消息:

    public void SendObject<T>(Protocol.Message.WrapperMessage.Types.MessageType type, T messageObject)
{
byte[] message;

// Serialize message
using (var stream = new MemoryStream())
{
((IMessage)messageObject).WriteTo(stream);

message = stream.GetBuffer();
}

byte[] wrapper = new Protocol.Message.WrapperMessage{Type = type, Payload = Google.Protobuf.ByteString.CopyFrom(message)}.ToByteArray();

Connection.SendObject<byte[]>("ByteMessage", wrapper);
}

还有我的服务器处理程序:

private void IncommingMessageHandler(PacketHeader header, Connection connection, byte[] message)
{
Protocol.Message.WrapperMessage wrapper = Protocol.Message.WrapperMessage.Parser.ParseFrom(message);

switch (wrapper.Type)
{
case Protocol.Message.WrapperMessage.Types.MessageType.HelloMessage:
GetClient(connection.ConnectionInfo.NetworkIdentifier).MessageHandler(Protocol.Message.HelloMessage.Parser.ParseFrom(wrapper.Payload.ToByteArray()));

break;
}
}

包装消息完全反序列化,类型正确匹配,但在处理我的有效负载时,异常弹出。

我做了坏事吗?

编辑:消息Payload的小屏幕 Payload

最佳答案

问题可能是您在使用 GetBuffer 时没有使用已知长度。 GetBuffer 返回超大 后备数组。流的 .Length 之后的数据是垃圾,不应被使用 - 它通常(但不总是)为零,这就是您所看到的。

要么使用 ToArray() 而不是 GetBuffer(),要么跟踪流的 .Length 并且只消耗那么多的超大缓冲区。


另一种可能性是“成帧”——看起来你正在处理数据包,但如果这是 TCP,则无法保证你接收到的数据 block 与你发送的数据 block 大小相同。如果您通过 TCP 发送多条消息,您需要实现自己的框架(通常通过长度前缀,因为您正在谈论二进制数据)。


顺便说一下,这不是 protobuf-net。


如果这些都不是问题:检查您收到的数据是否与您发送的数据(包括长度)完全一致(逐字节)。数据很容易被 IO 代码损坏或错误分块。

关于c# - 谷歌.Protobuf.InvalidProtocolBufferException : Protocol message contained an invalid tag (zero),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47193954/

66 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com