C # Отправка размера объекта с сериализованным объектом через асинхронное сокетное соединение - PullRequest
1 голос
/ 04 ноября 2010

Я хочу сериализовать объект и отправить его по сети.Я настроил его, используя атрибут ISerializeable в своем классе и BinaryFormatter для преобразования объекта в байты.Я могу отправить объект и десериализовать его на принимающей стороне.Однако, чтобы убедиться, что у меня есть весь объект, прежде чем пытаться восстановить его, я хочу отправить размер вместе с потоком.Я хотел бы установить первые несколько байтов в качестве размера, проверить, когда полученные данные имеют по крайней мере этот фиксированный размер, затем я могу прочитать это и получить полный размер объекта.Тогда это просто вопрос ожидания, пока мои полученные данные не станут размером объекта + байты фиксированного размера.Как я могу сместить мои данные в моем потоке, чтобы я мог отправить int для хранения размера объекта в качестве первых нескольких байтов, а мой объект - в качестве оставшихся байтов?

Ответы [ 4 ]

1 голос
/ 04 ноября 2010

Правильный ответ:

SocketPacket socketData = (SocketPacket)asyn.AsyncState;
socketData.currentSocket.EndReceive(asyn);
byte[] data = socketData.dataBuffer;   

Является ли не правильным способом чтения из SocketPacket

1 голос
/ 04 ноября 2010
MemoryStream resultStream = new MemoryStream();
resultStream.Write(BitConverter.GetBytes(objectStream.Length));
resultStream.Write(objectStream.ToArray());

// send the resultStream
1 голос
/ 04 ноября 2010

Можете ли вы просто сериализовать в MemoryStream, затем, как только это будет сделано, добавьте .Length из MemoryStream, затем данные (используйте GetBuffer() и скопируйте .Length байтов из массива).Обратный на приемнике;прочитать длину (обычно 4 байта), затем упаковать столько данных в MemoeryStream;перемотать MemoryStream (Position=0) и десериализовать.Конечно, вы должны согласиться с порядком байтов и т. Д.

(видите, и я даже не упомянул про ... ох, эта другая вещь)

1 голос
/ 04 ноября 2010

Что именно вы пытаетесь предотвратить?TCP уже имеет встроенные проверки согласованности и надежности.

...