C# tcpclient上的序列化数据需要说明数量?

C# tcpclient上的序列化数据需要说明数量?,c#,serialization,.net-4.0,tcpclient,C#,Serialization,.net 4.0,Tcpclient,我使用TcpClient以字节的形式发送数据,我想发送我自己的类,而不是字节的数据 通过字节数据,我的意思是我发送的数据转换成字节如下: using (MemoryStream bufferStream = new MemoryStream()) { using (BinaryWriter bufferData = new BinaryWriter(bufferStream)) { // Simple PONG Action bufferData.

我使用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);

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

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

你的代码应该是

 writer.WriteLine(JsonConvert.SerializeObject(commData))
从另一端获取数据

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

//**服务器**
Task.Factory.StartNew(()=>
{
var reader=newstreamreader(tcpClient.GetStream());
var writer=newstreamreader(tcpClient.GetStream());
while(true)
{
var myobj=JsonConvert.DeserializeObject(reader.ReadLine());
//与obj一起工作
//向客户端写入响应
WriteLine(JsonConvert.SerializeObject(commData));
}
}, 
TaskCreationOptions.LongRunning);

我曾考虑使用JSON,但使用JSON,客户机/服务器会知道它的大小或如何读取到最后吗?这是我主要关心的问题。@Guapo不,就像我的例子一样。除了序列化数据之外,您不会向流写入任何内容
EndOfLine
char用于序列化数据之间,并由ReadLine处理。您只需从网络读取行并反序列化。因此,在发送类数据之前,我必须将类数据中的任何行中断转换为其他内容,以避免在类结束之前中断?或者这并不重要,因为换行符不会发送EOF?不,
JsonConvert.SerializeObject
会为您处理此问题。啊,太酷了,我现在就试试。在了解数据大小等方面是否还有其他选择,如通用c#序列化?
//**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);