我需要反序列化通过TCP发送到服务器的对象,而只是想知道如何确定什么时候我已经收到了所有需要的数据的这样做呢?我假设数据不会一次显示出来,我对吗?如果有帮助,我在我的自定义对象中使用[Serializable()]
属性和ISerializable
接口。通过TCP反序列化自定义类对象?
2
A
回答
1
TCP提供的字节流。因为您怀疑您不一定会一口气收到它,您也不会知道流何时结束了某个特定的消息,因此您必须开发自己的应用程序级协议或使用现有的协议来确定此协议。
开发自己是很简单的,例如包括总字节数作为第一个四个字节的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;
}
那么你就需要一种方法来deseralize数组你可以使用.NET的BinaryFormatter
注意:你不需要发送对象的二进制形式 - 你可以将它们作为文本(例如Json或XML)发送它是更便携。如果使用二进制文件,则可以与发送者和接收者共享.NET程序集(例如作为.dll),以便他们可以访问相同的类型。
替代地使用已经开发了另一种应用层协议针对其NET库已经存在,并且负责处理所有的发送/插座/错误处理例如protobuf或WCF,您可以使用protobuf-net或Microsoft随WCF附带的WCF库。
相关问题
- 1. GSON:自定义对象反序列化
- 2. 通过TCP发送序列化对象
- 3. C++:自定义对象序列化/反序列化失败
- 4. 通过自定义序列化模拟Java对象外化
- 5. 通过TCP进行C#反序列化
- 6. JMS序列化程序序列化自定义对象并反序列化
- 7. 反序列化与自定义对象属性对象
- 8. JSon.Net反序列化自定义类
- 9. 使用Json.NET对自定义对象数组反序列化JSON
- 10. XML反序列化为自定义对象列表
- 11. 反序列化自定义JsonConverter中的嵌套对象列表
- 12. 如何反序列化自定义对象列表
- 13. 反序列化对象到类对象
- 14. 在ruby中通过rabbitmq序列化和反序列化对象
- 15. 通过Lift-JSON序列化和反序列化json对象
- 16. 通过序列化/反序列化维护对象引用
- 17. C#自定义序列化和反序列化的简单类
- 18. 通过二进制序列化/反序列化通过TCP发送文件
- 19. 自定义Json序列化器通过忽略类属性来序列化和反序列化所有属性
- 20. 将多个自定义对象序列化并反序列化为XML
- 21. 自定义对象是可序列化但不可反序列化的
- 22. 如何将自定义对象序列化并反序列化为xml?
- 23. 序列化自定义对象
- 24. WCF自定义对象序列化
- 25. 自定义对象集合序列化
- 26. 序列化自定义主体对象
- 27. 自定义对象序列化的Arraylist
- 28. Django:自定义对象json序列化
- 29. My.Settings序列化,自定义对象?
- 30. 通用XML反序列化到未定义的对象中