C# 如何在protobuf.net中反序列化UDPTunnel

C# 如何在protobuf.net中反序列化UDPTunnel,c#,protobuf-net,unityscript,C#,Protobuf Net,Unityscript,我正在用Unity3d中的mumble(c#脚本)编写voip客户端代码,现在我能够成功地连接到mumble的任何公共服务器。但是,当我尝试反序列化UDP隧道时,我会遇到很多异常,包括“无效的wiretype”、“数字溢出”、“无效字段”、“endofstream”、“结束了错误的组”和bla bla bla。。。所有这些都在这一行 var udpTunnel = Serializer.DeserializeWithLengthPrefix<UDPTunnel> (_ssl, Pre

我正在用Unity3d中的mumble(c#脚本)编写voip客户端代码,现在我能够成功地连接到mumble的任何公共服务器。但是,当我尝试反序列化UDP隧道时,我会遇到很多异常,包括“无效的wiretype”、“数字溢出”、“无效字段”、“endofstream”、“结束了错误的组”和bla bla bla。。。所有这些都在这一行

var udpTunnel = Serializer.DeserializeWithLengthPrefix<UDPTunnel> (_ssl, PrefixStyle.Fixed32BigEndian);
var udpTunnel=Serializer.DeserializeWithLengthPrefix(_ssl,PrefixStyle.Fixed32BigEndian);
其中_ssl是SslStream

这是我的完整方法

nternal void ProcessTcpData ()
{
        try {

                var masg = IPAddress.NetworkToHostOrder (_reader.ReadInt16 ());
                MessageType messageType = (MessageType)masg;
                Debug.Log ("Received message type: " + messageType);

                switch (messageType) {
                case MessageType.Version:
                        _mc.RemoteVersion = Serializer.DeserializeWithLengthPrefix<Version> (_ssl,
PrefixStyle.Fixed32BigEndian);
                        break;
                case MessageType.CryptSetup:
                        var cryptSetup = Serializer.DeserializeWithLengthPrefix<CryptSetup> (_ssl,
PrefixStyle.Fixed32BigEndian);
                        ProcessCryptSetup (cryptSetup);
                        break;
                case MessageType.CodecVersion:
                        _mc.CodecVersion = Serializer.DeserializeWithLengthPrefix<CodecVersion> (_ssl,
PrefixStyle.Fixed32BigEndian);
                        break;
                case MessageType.ChannelState:
                        _mc.ChannelState = Serializer.DeserializeWithLengthPrefix<ChannelState> (_ssl,
PrefixStyle.Fixed32BigEndian);
                        break;
                case MessageType.PermissionQuery:
                        _mc.PermissionQuery = Serializer.DeserializeWithLengthPrefix<PermissionQuery> (_ssl,
PrefixStyle.Fixed32BigEndian);
                        break;
                case MessageType.UserState:
                        _mc.UserState = Serializer.DeserializeWithLengthPrefix<UserState> (_ssl,
PrefixStyle.Fixed32BigEndian);
                        break;
                case MessageType.ServerSync:
                        _mc.ServerSync = Serializer.DeserializeWithLengthPrefix<ServerSync> (_ssl,
PrefixStyle.Fixed32BigEndian);
                        _mc.ConnectionSetupFinished = true;
                        break;
                case MessageType.ServerConfig:
                        _mc.ServerConfig = Serializer.DeserializeWithLengthPrefix<ServerConfig> (_ssl,
PrefixStyle.Fixed32BigEndian);
                        _validConnection = true; // handshake complete
                        break;
                case MessageType.TextMessage:
                        var textMessage = Serializer.DeserializeWithLengthPrefix<TextMessage> (_ssl, PrefixStyle.Fixed32BigEndian);
                        break;
                case MessageType.UDPTunnel:
                        if (_validConnection) {
                                var udpTunnel = Serializer.DeserializeWithLengthPrefix<UDPTunnel> (_ssl, PrefixStyle.Fixed32BigEndian);
                        }
                        break;
                case MessageType.Ping:
                        var ping = Serializer.DeserializeWithLengthPrefix<MumbleProto.Ping> (_ssl, PrefixStyle.Fixed32BigEndian);
                        Debug.Log ("Received ping: " + ping.timestamp + ", udp: " + ping.udp_packets + ", tcp:" +
                                ping.tcp_packets);
                        break;
                case MessageType.Reject:
                        var reject = Serializer.DeserializeWithLengthPrefix<Reject> (_ssl,
PrefixStyle.Fixed32BigEndian);
                        _validConnection = false;
                        _errorCallback ("Mumble server reject: " + reject.reason, true);
                        break;
                default:
                        _errorCallback ("Message type " + messageType + " not implemented", true);
                        break;
                }
                if (_validConnection) {
                        Debug.Log ("Handshake Complete:\tconnection is valid");
                }
        } catch (Exception ex) {
                Debug.LogException (ex);
        }
}
internal void ProcessTcpData()
{
试一试{
var masg=IPAddress.NetworkToHostOrder(_reader.ReadInt16());
MessageType MessageType=(MessageType)masg;
Log(“收到的消息类型:”+messageType);
开关(消息类型){
案例消息类型。版本:
_mc.RemoteVersion=Serializer.DeserializeWithLengthPrefix(_ssl,
前缀style.Fixed32BigEndian);
打破
案例MessageType.CryptSetup:
var cryptSetup=Serializer.DeserializeWithLengthPrefix(_ssl,
前缀style.Fixed32BigEndian);
ProcessCryptSetup(cryptSetup);
打破
case MessageType.CodecVersion:
_mc.CodecVersion=Serializer.DeserializeWithLengthPrefix(_ssl,
前缀style.Fixed32BigEndian);
打破
案例MessageType.ChannelState:
_mc.ChannelState=Serializer.DeserializeWithLengthPrefix(_ssl,
前缀style.Fixed32BigEndian);
打破
案例MessageType.PermissionQuery:
_mc.PermissionQuery=Serializer.DeserializeWithLengthPrefix(_ssl,
前缀style.Fixed32BigEndian);
打破
案例MessageType.UserState:
_mc.UserState=Serializer.DeserializeWithLengthPrefix(_ssl,
前缀style.Fixed32BigEndian);
打破
case MessageType.ServerSync:
_mc.ServerSync=Serializer.DeserializeWithLengthPrefix(_ssl,
前缀style.Fixed32BigEndian);
_mc.ConnectionSetupFinished=true;
打破
case MessageType.ServerConfig:
_mc.ServerConfig=Serializer.DeserializeWithLengthPrefix(_ssl,
前缀style.Fixed32BigEndian);
_validConnection=true;//握手完成
打破
case MessageType.TextMessage:
var textMessage=Serializer.DeserializeWithLengthPrefix(_ssl,PrefixStyle.Fixed32BigEndian);
打破
case MessageType.UDPTunnel:
如果(_validConnection){
var udpTunnel=Serializer.DeserializeWithLengthPrefix(_ssl,PrefixStyle.Fixed32BigEndian);
}
打破
case MessageType.Ping:
var ping=Serializer.DeserializeWithLengthPrefix(_ssl,PrefixStyle.Fixed32BigEndian);
Debug.Log(“收到的ping:+ping.timestamp+”,udp:+ping.udp_数据包+”,tcp:+
ping.tcp_数据包);
打破
案例消息类型。拒绝:
var reject=Serializer.DeserializeWithLengthPrefix(_ssl,
前缀style.Fixed32BigEndian);
_validConnection=false;
_errorCallback(“咕哝服务器拒绝:+reject.reason,true);
打破
违约:
_errorCallback(“消息类型”+消息类型+“未实现”,true);
打破
}
如果(_validConnection){
Log(“握手完成:\t连接有效”);
}
}捕获(例外情况除外){
Debug.LogException(ex);
}
}

_reader是一个二进制读取器

我已经通过使用

var size = IPAddress.NetworkToHostOrder (_reader.ReadInt32 ());
var udpTunnel = new UDPTunnel { packet = _reader.ReadBytes(size) };

现在我不知道为什么Deserializewithlengthprefix不起作用,因为据我所知,这些行正在做同样的事情。

您是否返回您发送的相同字节?直到你知道你得到了正确的数据:其他一切都是没有意义的。