E sad, kada sa sa klijentskog dela pokusam da serverskom delu prosledim neki "custom" objekat (koji moze da se serijalizuje, naravno), na serverskom delu dobijem "OutOfMemory" gresku! Citao sam clanke na drugim sajtovima, kopirao kod, ali nikako mi nije jasno gde gresim.
Test klasa koja je definisana i u klijentskom i u serverskom kodu:
[Serializable]
class Boza
{
public string poruka="default";
}
kod za slanje (nalazi se u klijentskom delu programa):
private void cmdSendData_Click(object sender, System.EventArgs e)
{
try
{
Boza boza = new Boza();
NetworkStream ns = new NetworkStream(m_socWorker); //m_socWorker je Socket
BinaryWriter bw = new BinaryWriter(ns);
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, boza);
bw.Write(ms.ToArray());
MessageBox.Show("Duzina: " + ms.ToArray().Length); //duzina je 152!
ns.Close();
}
catch(System.Net.Sockets.SocketException se)
{
MessageBox.Show (se.Message );
}
}
gornji kod radi bez problema. Kod serverskog dela za prijem podataka (kod koji i pravi probleme):
public void OnDataReceived(IAsyncResult asyn)
{
try
{
CSocketPacket theSockId = (CSocketPacket)asyn.AsyncState ;
NetworkStream ns = new NetworkStream(m_socWorker);
byte[] buffer = new byte[1024];
ns.Read(buffer, 0, buffer.Length);
BinaryFormatter bin = new BinaryFormatter();
MemoryStream mem = new MemoryStream(buffer.Length);
mem.Write(buffer, 0, buffer.Length);
mem.Seek(0, SeekOrigin.Begin);
Boza boz = (Boza)bin.Deserialize(mem); //OVDE SE JAVLJA GRESKA!
MessageBox.Show(boz.poruka);
theSockId.thisSocket.EndReceive(asyn);
WaitForData(m_socWorker);
}
catch (ObjectDisposedException )
{
System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket has been closed\n");
}
catch(SocketException se)
{
MessageBox.Show (se.Message );
}
}
Greska se javlja prilikom pokusaja deserijalizacije. Gde gresim? Gde je problem u kodu?