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

时间:2012-10-04 06:46:15

标签: c# serialization .net-4.0 tcpclient

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

按字节数据,我的意思是我发送的数据转换成如下字节:

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

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

1 个答案:

答案 0 :(得分:2)

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

您的代码将类似于

 writer.WriteLine(JsonConvert.SerializeObject(commData))

并在另一端获取数据

var myobj = JsonConvert.DeserializeObject<MyCommunicationData>(reader.ReadLine())

- 编辑 -

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