C# 通过网络发送对象
我正在尝试创建一个C#应用程序,它有两个部分——服务器和客户端。客户机需要通过网络与服务器通信(测试时,两个部分都在本地计算机上通过“127.0.0.1”进行通信)。我曾尝试将套接字与序列化结合起来,但没有成功 我尝试序列化并发送简单(测试)对象,如下所示:C# 通过网络发送对象,c#,sockets,networking,serialization,C#,Sockets,Networking,Serialization,我正在尝试创建一个C#应用程序,它有两个部分——服务器和客户端。客户机需要通过网络与服务器通信(测试时,两个部分都在本地计算机上通过“127.0.0.1”进行通信)。我曾尝试将套接字与序列化结合起来,但没有成功 我尝试序列化并发送简单(测试)对象,如下所示: [Serializable] class Test { public string msg="default"; } try { Test tst = new Test(); tst.msg = "TEST";
[Serializable]
class Test
{
public string msg="default";
}
try
{
Test tst = new Test();
tst.msg = "TEST";
NetworkStream ns = new NetworkStream(m_socWorker);
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, tst);
m_socWorker.Send(ms.ToArray());
}
catch(System.Net.Sockets.SocketException se)
{
MessageBox.Show (se.Message );
}
public void OnDataReceived(IAsyncResult asyn)
{
try
{
CSocketPacket theSockId = (CSocketPacket)asyn.AsyncState ;
//end receive...
Test tst;
byte[] buffer = new byte[1024];
m_socWorker.Receive(buffer);
BinaryFormatter bin = new BinaryFormatter();
MemoryStream mem = new MemoryStream(buffer);
tst = (Test)bin.Deserialize(mem);
txtDataRx.Text = tst.msg;
theSockId.thisSocket.EndReceive(asyn);
}
catch (ObjectDisposedException)
{
System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket has been closed\n");
}
catch(SocketException se)
{
MessageBox.Show (se.Message );
}
}
此类在服务器和客户端代码中都定义
发送代码如下所示:
[Serializable]
class Test
{
public string msg="default";
}
try
{
Test tst = new Test();
tst.msg = "TEST";
NetworkStream ns = new NetworkStream(m_socWorker);
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, tst);
m_socWorker.Send(ms.ToArray());
}
catch(System.Net.Sockets.SocketException se)
{
MessageBox.Show (se.Message );
}
public void OnDataReceived(IAsyncResult asyn)
{
try
{
CSocketPacket theSockId = (CSocketPacket)asyn.AsyncState ;
//end receive...
Test tst;
byte[] buffer = new byte[1024];
m_socWorker.Receive(buffer);
BinaryFormatter bin = new BinaryFormatter();
MemoryStream mem = new MemoryStream(buffer);
tst = (Test)bin.Deserialize(mem);
txtDataRx.Text = tst.msg;
theSockId.thisSocket.EndReceive(asyn);
}
catch (ObjectDisposedException)
{
System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket has been closed\n");
}
catch(SocketException se)
{
MessageBox.Show (se.Message );
}
}
接收代码如下所示:
[Serializable]
class Test
{
public string msg="default";
}
try
{
Test tst = new Test();
tst.msg = "TEST";
NetworkStream ns = new NetworkStream(m_socWorker);
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, tst);
m_socWorker.Send(ms.ToArray());
}
catch(System.Net.Sockets.SocketException se)
{
MessageBox.Show (se.Message );
}
public void OnDataReceived(IAsyncResult asyn)
{
try
{
CSocketPacket theSockId = (CSocketPacket)asyn.AsyncState ;
//end receive...
Test tst;
byte[] buffer = new byte[1024];
m_socWorker.Receive(buffer);
BinaryFormatter bin = new BinaryFormatter();
MemoryStream mem = new MemoryStream(buffer);
tst = (Test)bin.Deserialize(mem);
txtDataRx.Text = tst.msg;
theSockId.thisSocket.EndReceive(asyn);
}
catch (ObjectDisposedException)
{
System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket has been closed\n");
}
catch(SocketException se)
{
MessageBox.Show (se.Message );
}
}
当我发送数据时,我收到一个异常-
“引发了类型为'System.OutOfMemoryException'的异常。”
指向“反序列化”行
我的代码中是否有明显的问题?我建议简化测试代码:
运气好嗯……我不熟悉WFC,从未使用过它:\n这就是为什么我在序列化/反序列化字符串时没有使用它,我得到了“对象无映射”异常:\n好的,字符串不是大问题,但自定义对象?:DCustom对象也不例外。您仍然只是发送一个字节数组。。。现在您只需要了解序列化/反序列化:-)