2010-04-29 5 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, которые уведомляют об окончании потока, когда последний байт был прочитан.