我希望将一个名为“Player”的类序列化并通过网络流发送给客户端。
玩家类
玩家类
[ProtoMember(1)]
public int flag;
[ProtoMember(2)]
public Int16 id;
[ProtoMember(3)]
public MyVector3 CharPos;
[ProtoMember(7)]
public bool spawned;
MyVector3
是由于protobuf不支持Vector3
的序列化而创建的。
[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);
}
}
序列化和反序列化功能
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;
}
测试功能(实际上不起作用!)
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();
}
}
现在会发生什么:
当启动DeserializeTest
并尝试从networkStream
反序列化数据时,整个函数会“冻结”并开始循环。仅在客户端对数据进行序列化并将其发送到服务器(此代码)进行反序列化时,一切都能正常运行。
Vector3
;如果您想要,我可以向您展示如何配置它。 - Marc GravellPlayer
类型 - 它在混合中引入了一个静默的<object>
,这是不喜欢的。完整示例请参见编辑;还要注意使用MyVector3。 - Marc Gravell