2010-04-29 43 views
4

我想通過網絡流發送XML可序列化的對象。XmlSerializer.Deserialize通過NetworkStream塊

我已經在UDP廣播服務器上使用過它,它從本地網絡接收UDP消息。在這裏,服務器端的一個片段:

while (mServiceStopFlag == false) { 
    if (mSocket.Available > 0) { 
     IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, DiscoveryPort);  byte[] bData; 

    // Receive discovery message 
    bData = mSocket.Receive(ref ipEndPoint); 
    // Handle discovery message 
    HandleDiscoveryMessage(ipEndPoint.Address, bData); 
    ... 

這實際上是在客戶端:

IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Broadcast, DiscoveryPort); 
MemoryStream mStream = new MemoryStream(); 
byte[] bData; 

// Create broadcast UDP server 
mSocket = new UdpClient(); 
mSocket.EnableBroadcast = true; 

// Create datagram data 
foreach (NetService s in ctx.Services) 
    XmlHelper.SerializeClass<NetService>(mStream, s); 
bData = mStream.GetBuffer(); 

// Notify the services 
while (mServiceStopFlag == false) { 
    mSocket.Send(bData, (int)mStream.Length, ipEndPoint); 
    Thread.Sleep(DefaultServiceLatency); 
} 

它工作得很好。

但現在i'me試圖獲得相同的結果,但在一個TcpClient插座,但直接使用XMLSerializer實例:

在服務器端:

TcpClient sSocket = k.Key; 
ServiceContext sContext = k.Value; 
Message msg = new Message(); 

while (sSocket.Connected == true) { 
    if (sSocket.Available > 0) { 
     StreamReader tr = new StreamReader(sSocket.GetStream()); 
     msg = (Message)mXmlSerialize.Deserialize(tr); 

     // Handle message 
     msg = sContext.Handler(msg); 
     // Reply with another message 
     if (msg != null) 
      mXmlSerialize.Serialize(sSocket.GetStream(), msg); 
    } else 
     Thread.Sleep(40); 
} 

而且在客戶端:

NetworkStream mSocketStream; 
Message rMessage; 

// Network stream 
mSocketStream = mSocket.GetStream(); 

// Send the message 
mXmlSerialize.Serialize(mSocketStream, msg); 
// Receive the answer 
rMessage = (Message)mXmlSerialize.Deserialize(mSocketStream); 

return (rMessage); 

的數據被髮送(可用屬性是大於0),但該方法XmlSerialize.Deserialize(應反序列化消息類)塊。

我錯過了什麼?

回答

2

當然,因爲串行器繼續讀取NetworkStream,並且它不會在嵌套主要終端元素時結束。

爲了達到想要的結果,有必要使用MemoryStream,它在最後一個字節被讀取時通知流的結束。