我目前使用套接字來嘗試和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在服務方面沒有工作...
在此先感謝。