2009-12-30 12 views
1

我目前使用套接字來嘗試和Silverlight 3的客戶端和.NET3.5服務之間發送消息意外結束反序列化。我可以很好地建立TCP連接,併發送數據,但是我的問題是串行化和解串行DataContracts。.NET/Silverlight的:DataContractSerializer的字節數組和插座:

目前,我們正在使用WCF PollingDuplex結合做這項工作,但我們並不滿意它的性能,所以正在努力插座,同時仍試圖利用DataContract屬性。我的代碼如下:

// Client 
public void Send(ActionMessage actionMessage) 
{ 
     DataContractSerializer dcs = 
      new DataContractSerializer(actionMessage.GetType()); 

     MemoryStream memoryStream = new MemoryStream(); 

     dcs.WriteObject(memoryStream, actionMessage); 

     byte[] sendBuffer = new byte[4096]; 
     memoryStream.Position = 0; 
     memoryStream.Read(sendBuffer, 0, sendBuffer.Length); 

     SocketAsyncEventArgs socketAsyncEventArgs = new SocketAsyncEventArgs(); 

     socketAsyncEventArgs.SetBuffer(sendBuffer, 0, sendBuffer.Length); 

     if(!_socket.SendAsync(socketAsyncEventArgs)) 
      HandleSendComplete(socketAsyncEventArgs); 
    } 

// Service 

private byte[] _recieveBuffer = new byte[4096]; 
private int _receivedLength; 

private void socket_OnReceiveComplete(IAsyncResult asyncResult) 
{ 
     _receivedLength += _tcpClient.Client.EndReceive(asyncResult); 

     // See if there's more data that we need to grab 
     if (_receivedLength < _recieveBuffer.Length) 
     { 
      // Need to grab more data so receive remaining data 
      _tcpClient.Client.BeginReceive(_recieveBuffer, _receivedLength, 
       _recieveBuffer.Length - _receivedLength, SocketFlags.None, 
       new AsyncCallback(socket_OnReceiveComplete), null); 

      return; 
     } 

     MemoryStream memoryStream = new MemoryStream(); 

     memoryStream.Position = 0; 
     memoryStream.Write(_recieveBuffer, 0, _recieveBuffer.Length); 

     DataContractSerializer dcs = new DataContractSerializer(typeof(ActionMessage)); 

     object o = dcs.ReadObject(memoryStream); 

     ActionMessage actionMessage = (ActionMessage) o; 
} 

它是引發XmlException:意外文件結尾的ReadObject行。我已經嘗試了各種各樣的東西,包括從字節數組(_recieveBuffer)截斷尾部0,當它被接收時,只剩下一個0結束等,但似乎沒有任何工作。我檢查了客戶端和服務器端的byte []緩衝區,它們在開始和結束時的值相同,長度相同。我也嘗試使用actionMessage.GetType()和typeof(ActionMessage)作爲參數到DataContractSerializer,但沒有區別...

我在這裏誤解了什麼:爲什麼dataContractSerializer.Write()不接受輸出由dataContractSerializer.Read()生成?

我有一個美好的一天,直到擊中這個......我確實發現了另一個人有同樣的問題,但提供的解決方案,設置memoryStream.Position = 0在服務方面沒有工作...

在此先感謝。

回答

0

如果我猜的話,我會說,你memoryStream.Position = 0;線路在錯誤的地方。

你需要寫緩衝到流後重置流中的位置。