Отправить объект на сервер в C # - PullRequest
3 голосов
/ 17 декабря 2011

У меня есть клиент-серверное приложение, созданное на 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;

Тогда это дает мне ошибку, потому что он не знает, какими свойствами обладает объект. Кто-нибудь есть идеи, как это сделать ??

Ответы [ 2 ]

2 голосов
/ 17 декабря 2011

Приведите его из объекта в Actions:

object Cls = this.ByteArrayToObject ( socketData.dataBuffer );
Actions action = (Actions)Cls;

Это самый простой способ сделать это.Также следует добавить обработку исключений, проверку типов и т. Д.

1 голос
/ 17 декабря 2011

Как клиент, так и сервер должны знать о типах объектов, которые могут быть сериализованы через соединение.

Во-вторых, вам нужен способ указать, какой тип объекта вы передаете, поэтомудругой конец знает, как его десериализовать.Это может быть условно (один и тот же вызов всегда отправляет одно и то же сообщение) или с дополнительными данными в потоке сообщений.Или с другим сериализатором.

Вы смотрели на WCF вообще?Он предоставляет способы довольно абстрактного абстрагирования с помощью контрактов данных.

...