我有一个用C#编写的客户端/服务器应用程序。当我向服务器发送字符串消息时它工作正常。但我需要将(简单)对象发送到服务器而不是字符串。但我不知道该怎么做。我目前为我的客户提供此服务:
我要发送的课程:
[Serializable]
public class Actions
{
// Movement
public bool forward = false;
public bool left = false;
public bool backward = false;
public bool right = false;
}
然后我使用默认的Send()命令发送对象。但在发生这种情况之前,我首先将Actions类转换为字节数组,如下所示:
public void SendObject ( object obj )
{
this.socket.Send ( this.ObjectToByteArray ( obj ) );
}
// Convert an object to a byte array
private byte[] ObjectToByteArray(object obj)
{
if(obj == null)
return null;
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, obj);
return ms.ToArray();
}
在服务器端,我收到这样的数据(这就是我被困在......):
public void OnDataReceived(IAsyncResult asyn)
{
SocketPacket socketData = (SocketPacket)asyn.AsyncState;
try
{
// Complete the BeginReceive() asynchronous call by EndReceive() method
// which will return the number of characters written to the stream
// by the client
int iRx = socketData.m_currentSocket.EndReceive (asyn);
char[] chars = new char[iRx + 1];
// CONVERT THE BYTE ARRAY BACK TO AN OBJECT
//object Cls = this.ByteArrayToObject ( socketData.dataBuffer );
}
catch ( ... ) { }
}
我该怎么做才能访问服务器上的对象?当我这样做时显然: Cls.forward;
然后它给了我一个错误,因为它不知道对象有什么属性。任何人都知道如何做到这一点??
答案 0 :(得分:2)
将其从对象投射到Actions
:
object Cls = this.ByteArrayToObject ( socketData.dataBuffer );
Actions action = (Actions)Cls;
这是最简单的方法。您还应该添加异常处理,类型检查等。
答案 1 :(得分:1)
通常,客户端和服务器都需要知道可以通过连接序列化的对象类型。
其次,您需要一种方法来指示您传递的对象类型,因此另一端知道如何反序列化它。这可以按照惯例(相同的调用始终发送相同类型的消息)或消息流中的其他数据。或者使用不同的序列化器。
你有没有看过WCF?它提供了通过数据合同很好地抽象所有这些的方法。