我需要反序列化通過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反序列化到未定義的對象中