Tell me the exception (End of Stream encountered before parsing was completed) when deserializing an object in a client-server application on the server. Customer:
private void Send(Socket client) { byte[] buffer; fileDetails = new FileDetails(); using (_memoryStream = new MemoryStream()) { using (Stream fs = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read, FileShare.None)) { fs.Read(fileDetails.buffer, 0, fileDetails.buffer.Length); // считывается имя с TextBoxa string[] temp = textBox1.Text.Split('\\'); string[] temp2 = temp[temp.Length - 1].Split('.'); fileDetails.fileName = temp2[0]; fileDetails.fileType = temp2[1]; IFormatter formatter = new BinaryFormatter(); formatter.Serialize(_memoryStream, fileDetails); } } buffer = _memoryStream.ToArray(); client.BeginSend(buffer, 0, buffer.Length, 0, new AsyncCallback(SendCallback), client); } private void SendCallback(IAsyncResult ar) { try { // Retrieve the socket from the state object. Socket handler = (Socket)ar.AsyncState; // Complete sending the data to the remote device. handler.EndSend(ar); sendDone.Set(); } catch (Exception e) { MessageBox.Show(e.ToString()); } } Server:
private static void AcceptCallback(IAsyncResult ar) { // Signal the main thread to continue. allDone.Set(); // Get the socket that handles the client request. listener = (Socket) ar.AsyncState; handler = listener.EndAccept(ar); // Create the state object. buffer = new byte[1024]; handler.BeginReceive(buffer, 0, buffer.Length, 0, new AsyncCallback(ReadCallback), listener); } private static void ReadCallback(IAsyncResult ar) { // Signal the main thread to continue. allDone.Set(); listener = (Socket) ar.AsyncState; fileDet = new FileDetails(); int bytesRead = handler.EndReceive(ar); if (bytesRead == 0) { return; } if (bytesRead > 0) { using (_memoryStream = new MemoryStream(buffer)) { _memoryStream.Seek(0, 0); // не помогает //_memoryStream.Flush тоже BinaryFormatter fileFormatter = new BinaryFormatter(); fileDet = (FileDetails) fileFormatter.Deserialize(_memoryStream); string fileName = fileDet.fileName + "." + fileDet.fileType; using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Read, FileShare.Read)) { fs.Write(fileDet.buffer, 0, fileDet.buffer.Length); } } } else { // Not all data received. Get more. handler.BeginReceive(buffer, 0, buffer.Length, 0, new AsyncCallback(ReadCallback), listener); } } The object that I want to deserialize (be in a separate assembly):
[Serializable] public class FileDetails { private string _fileName; private string _fileType; public string fileName { get { return _fileName; } set { _fileName = value; } } public string fileType { get { return _fileType; } set { _fileType = value; } } public byte[] buffer = new byte[1024];
_memoryStream.ToArray()written outsideusing- this is not allowed. - nick_n_aMemoryStream(buffer)fix onMemoryStream(buffer,0,bytesRead )- nick_n_a