2014-03-25 22 views
1

我有一個MemoryStream,當我從網絡中接收數據時,我寫入了它。由於數據可以被分解,所以流可能具有存儲在流中的部分消息或多個消息。反序列化時,我將指針放回到流的開頭,並嘗試反序列化我的一個類。我有反序列化包裝在一個try catch塊中,但我到達反序列化行,應用程序只是退出(沒有例外,沒有更多的線在函數中運行等)。反序列化具有多個對象的.NET流

我有多個問題:

  1. 什麼是從網絡,可能會或可能不會完成接收XML數據流的最佳方式,如果是的話可能會或可能不會有一個以上的消息?
  2. 解串器是否需要了解編碼以解碼MemoryStream中的XML?
  3. 反序列化是否在反序列化對象之後放置流指針?
  4. 你可以反序列化單個流內的多個對象嗎?
+3

請發表您使用序列化的代碼行和反序列化流。通常,網絡層將負責確保收到完整的消息,而不是反序列化代碼。你問題的這個方面讓我感到困惑。 –

+0

您確實需要弄清楚爲什麼反序列化的調用會在沒有異常的情況下退出。另外,如果解串器發生異常,它很可能不能重新同步和重新啓動。 –

回答

0

1)您可以利用XmlReader類「提供只讀,只讀訪問XML數據流」。這可以幫助你翻譯可能不完整的XML數據。 http://msdn.microsoft.com/en-us/library/vstudio/system.xml.xmlreader

2)如果你指的是混合ASCII,UTF-8等,那麼是的,否則我不知道問題是什麼。

3)這取決於您正在使用的解串器。

4)是的,用XmlReader類,你可以巧妙地提取後消費屬性和XML片段(儘管該解決方案是不優雅,相當醜陋)

+0

謝謝你的回答。如果流僅僅是前向的,當我嘗試反序列化並且指針被移動時,存儲在流中的數據會發生什麼?我需要創建一個新的流嗎? – Clamport

+0

至於問題2,我如何告訴解串器什麼編碼期望數據? – Clamport

+0

數據總是在你的記憶流對象中(或者你曾經分配過內存的地方),並且會一直存在,直到你釋放它爲止。如果它在一個MemoryStream對象中,您將創建一個StreamReader對象,將它傳遞給包含您的數據包的MemoryStream。您可以使用該類指定編碼。 [鏈接](http://msdn.microsoft.com/en-us/library/ms143456(v = vs.110).aspx)通過重新創建類或使用MemoryStream.Seek()可以「倒回」命令。 – Domin8urMind

相關問題