tcpclient上的序列化数据需要状态量吗?

我使用TcpClient以字节forms发送数据,我想发送自己的类而不是数据字节。

按字节数据,我的意思是我将数据转换为字节,如下所示:

using (MemoryStream bufferStream = new MemoryStream()) { using (BinaryWriter bufferData = new BinaryWriter(bufferStream)) { // Simple PONG Action bufferData.Write((byte)10); } _logger.Info("Received PING request, Sending PONG"); return bufferStream.ToArray(); } 

相反,我想像这样发送它,而不必声明它的大小或w / e

 public class MyCommunicationData { public ActionType Action { get; set; } public Profile User { get; set; } ... } 

通常,当我将数据作为字节发送时,前5个字节用于指示操作和消息大小。

但是如果我迁移到将所有数据序列化为单个类,我是否仍然需要发送它的动作和大小,或者使用序列化消息,客户端和服务器将知道要读取的内容等,或者有没有办法这样做我可以发送它而不必指定序列化对象的东西?

不确定这是否重要,我使用AsyncCallback来读写网络流:

 _networkStream = _client.tcpClient.GetStream(); _callbackRead = new AsyncCallback(_OnReadComplete); _callbackWrite = new AsyncCallback(_OnWriteComplete); 

如果您需要我发布任何其他function,请告诉我。

如果使用基于文本的序列化程序(例如,Json),则可以使用StreamReader的ReadLine和StreamWriter的WriteLine (从tcpClient.GetStream创建)。

你的代码就像是

  writer.WriteLine(JsonConvert.SerializeObject(commData)) 

并在另一端获取数据

 var myobj = JsonConvert.DeserializeObject(reader.ReadLine()) 

– 编辑 –

 //**Server** Task.Factory.StartNew(() => { var reader = new StreamReader(tcpClient.GetStream()); var writer = new StreamReader(tcpClient.GetStream()); while (true) { var myobj = JsonConvert.DeserializeObject(reader.ReadLine()); //do work with obj //write response to client writer.WriteLine(JsonConvert.SerializeObject(commData)); } }, TaskCreationOptions.LongRunning);