C#通过异步套接字连接发送带有序列化对象的对象的大小

时间:2010-11-03 23:13:07

标签: c# serialization memorystream asyncsocket binaryformatter

我想序列化一个对象并通过网络发送它。我在我的类和BinaryFormatter上使用ISerializeable属性设置它以将对象转换为字节。我可以发送对象并在接收端反序列化它。但是,为了确保在尝试重建之前我拥有整个对象,我想将该大小与流一起发送。我想将前几个字节设置为大小,检查接收到的数据是否至少是这个固定大小,然后我可以读取它并获得对象的完整大小。然后,它只是等待我的接收数据是对象的大小+固定大小字节。如何在流中偏移我的数据,以便我可以发送一个int来存储对象的大小作为前几个字节,我的对象作为剩余的字节?

4 个答案:

答案 0 :(得分:1)

你到底想要阻止什么? TCP已经内置了一致性和可靠性检查。

答案 1 :(得分:1)

MemoryStream resultStream = new MemoryStream();
resultStream.Write(BitConverter.GetBytes(objectStream.Length));
resultStream.Write(objectStream.ToArray());

// send the resultStream

答案 2 :(得分:1)

您可以序列化为MemoryStream,然后完成后,添加.Length中的MemoryStream,然后添加数据(使用GetBuffer()并复制{{ 1}}来自数组的字节)。反转接收器;读取长度(通常为4个字节),然后将那么多数据打包到.Length;倒回MemoeryStreamMemoryStream)并反序列化。当然,你需要同意字节顺序等。

(见,我甚至没有提到prot ...哦,那个其他的东西)

答案 3 :(得分:1)

正确的答案是:

SocketPacket socketData = (SocketPacket)asyn.AsyncState;
socketData.currentSocket.EndReceive(asyn);
byte[] data = socketData.dataBuffer;   

是从SocketPacket中读取的正确方法

相关问题