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);