gpt4 book ai didi

c# - 通过 TCP 反序列化自定义类对象?

转载 作者:可可西里 更新时间:2023-11-01 02:42:34 28 4
gpt4 key购买 nike

我需要对通过 TCP 发送到服务器的对象进行反序列化,我只是想知道如何确定我何时收到了执行此操作所需的所有数据?我假设数据不会一次性全部显示出来;我对吗?如果有帮助,我将在我的自定义对象中使用 [Serializable()] 属性和 ISerializable 接口(interface)。

最佳答案

TCP 提供字节流。正如您所怀疑的那样,您不一定会一次性收到所有消息,您也不知道特定消息的流何时结束,因此您必须开发自己的应用程序级协议(protocol)或使用现有协议(protocol)来确定这一点。

自己开发很简单,例如将总字节数作为 int 包含在前四个字节中,这样您就知道在收到消息之前还有多少字节,例如:

    public static int Recieve(NetworkStream myNetworkStream, byte[] myBigBuffer)
{
// Read size of message being received
var myReadBuffer = new byte[1024];
myNetworkStream.Read(myReadBuffer, 0, sizeof(int));
var sizeOfMessage = BitConverter.ToInt32(myReadBuffer, 0);

// Read incoming message may be larger than the myReadBuffer size, into myBigBuffer
// supplied.
//
var numberOfBytesRead = 0;
do
{
var readSize = myNetworkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
Buffer.BlockCopy(myReadBuffer, 0, myBigBuffer, numberOfBytesRead, readSize);
numberOfBytesRead += readSize;
}
while (numberOfBytesRead < sizeOfMessage);

return numberOfBytesRead;
}

那么你需要一种方法来反序列化一个字节数组到你的对象/从你的对象,因为你已经将它们标记为 Serializable 你可以使用 .NET 的 BinaryFormatter

注意:您不需要以二进制形式发送对象 - 您可以将它们作为更便携的文本(例如 Json 或 XML)发送。如果使用二进制文件,您可以与发送方和接收方共享 .NET 程序集(例如作为 .dll),以便他们可以访问相同的类型。

或者使用另一个已经开发的应用程序级协议(protocol),其 .NET 库已经存在并负责处理所有传输/套接字/错误处理,例如protobuf或 WCF,您可以使用 protobuf-net或 .NET 附带的 Microsoft WCF 库。

关于c# - 通过 TCP 反序列化自定义类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32431537/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com