protobuf-net falha ao desserializar minha classe
Eu quero serializar uma classe 'Player' e enviá-la pelo meu fluxo de rede para um client
Player Class
[ProtoMember(1)]
public int flag;
[ProtoMember(2)]
public Int16 id;
[ProtoMember(3)]
public MyVector3 CharPos;
[ProtoMember(7)]
public bool spawned;
MyVector3
(devido ao fato de o protobuf não suportar serialização deVector3
)
[ProtoContract]
public class MyVector3
{
[ProtoMember(4)]
public float X { get; set; }
[ProtoMember(5)]
public float Y { get; set; }
[ProtoMember(6)]
public float Z { get; set; }
public MyVector3()
{
this.X = 0.0f;
this.Y = 0.0f;
this.Z = 0.0f;
}
public MyVector3(float x, float y, float z)
{
this.X = x;
this.Y = y;
this.Z = z;
}
public static implicit operator Vector3(MyVector3 v)
{
return new Vector3(v.X, v.Y, v.Z);
}
public static implicit operator MyVector3(Vector3 v)
{
return new MyVector3(v.X, v.Y, v.Z);
}
}
Serialize e desserialize Function
public byte[] serialize(Object obj)
{
if (obj == null)
{
return null;
}
MemoryStream ms = new MemoryStream();
Serializer.SerializeWithLengthPrefix(ms,obj,PrefixStyle.Base128);
return ms.ToArray();
}
public Player deserialize(NetworkStream inc)
{
Player obj = Serializer.DeserializeWithLengthPrefix<Player>(inc,PrefixStyle.Base128);
return obj;
}
unção @Test (que de fato não funciona!)
static void Main(string[] args)
{
TcpListener serverSocket = new TcpListener(8888);
TcpClient clientSocket = default(TcpClient);
Serialize ser = new Serialize();
Player temp = new Player();
serverSocket.Start();
while (true)
{
clientSocket = serverSocket.AcceptTcpClient();
using (NetworkStream networkStream = clientSocket.GetStream())
{
DeserializeTest(ser,networkStream);
SerializeTest(ser, networkStream);
}
}
}
static void SerializeTest(Serialize ser,NetworkStream networkStream)
{
Player temp = new Player();
BinaryWriter writer = new BinaryWriter(networkStream);
writer.Write(ser.serialize(temp));
networkStream.Flush();
}
static void DeserializeTest(Serialize ser, NetworkStream networkStream)
{
Player temp = new Player();
temp = (Player)ser.deserialize(networkStream);
Console.WriteLine(temp.flag.ToString() + temp.CharPos.ToString());
networkStream.Flush();
}
}
O que acontece agora:
Quando oDeserializeTest
é iniciado e o protobuf tenta desserializar os dados donetworkStream
toda a função meio que "congela" e começa a fazer um loop. Quando eu sous serializar os dados (no cliente) e enviá-los para o servidor (este código) onde é desserializado, tudo funciona como um encant