2010-04-29 89 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,它在最后一个字节被读取时通知流的结束。