0

byte[]非同期ソケットを使用して送信する前に、変数の内容をエンコードしたいと思います。

private void SendDatabaseObj(Socket handler, BuildHistoryClass buildHistoryQueryResult)
{
    byte[] byteData = ObjectToByteArray(buildHistoryQueryResult);

    // Begin sending the data to the remote device.
    handler.BeginSend(byteData, 0, byteData.Length, 0,
        new AsyncCallback(SendCallback), handler);
}

buildHistoryQueryResultこの関数を使用してシリアル化されます。

private byte[] ObjectToByteArray(BuildHistoryClass obj)
{
    BinaryFormatter bf = new BinaryFormatter();
    MemoryStream ms = new MemoryStream();
    bf.Serialize(ms, obj);
    return ms.ToArray();
}

レシーバーで例外が発生しているため、「適切な」エンコード形式は次のとおりです。

SerializationException がキャッチされました 入力ストリームが有効なバイナリ形式ではありません。開始内容 (バイト単位) は、04-00-00-00-06-0F-00-00-00-04-54-72-75-65-06-10-00 ...

受信側:

        private void ReceiveCallback_onQuery(IAsyncResult ar)
        {
            try
            {
                // Retrieve the state object and the client socket 
                // from the asynchronous state object.
                StateObject state = (StateObject)ar.AsyncState;
                Socket client = state.workSocket;

                // Read data from the remote device.
                int bytesRead = client.EndReceive(ar);

                if (bytesRead > 0)
                {
                    // There might be more data, so store the data received so far.
                    state.sb.Append(state.buffer);

                    // Get the rest of the data.
                    client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                        new AsyncCallback(ReceiveCallback_onQuery), state);
                }
                else
                {
                    // All the data has arrived; put it in response.
                    if (state.sb.Length > 1)
                    {
                        response_onQueryHistory = ByteArrayToObject(state.buffer);
                    }
                    // Signal that all bytes have been received.
                    receiveDoneQuery.Set();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }

デシリアライズ機能:

        private BuildHistoryClass ByteArrayToObject(byte[] arrayBytes)
        {
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();
            ms.Write(arrayBytes, 0, arrayBytes.Length);
            ms.Seek(0, SeekOrigin.Begin);
            BuildHistoryClass obj = (BuildHistoryClass)bf.Deserialize(ms);
            return obj;
        }
4

1 に答える 1

2

独自のコードにバグがあり、それが原因である可能性がありSerializationExceptionます。受信側には、次のコードとコメントがあります。

// There might be more data, so store the data received so far.
state.sb.Append(state.buffer);

さらに後で(すべてのデータを受信した後)、次のようになります。

// All the data has arrived; put it in response.
if (state.sb.Length > 1)
{
    response_onQueryHistory = ByteArrayToObject(state.buffer);
}

state.buffer何が入っているかを逆シリアル化する必要がある場所を逆シリアル化していることに注意してくださいstate.sb

于 2012-11-20T06:31:24.820 に答える