Вы сбрасываете позицию потока в неправильное время.
В вашем случае вы пишете 'length' в начало потока.
Должно работать следующее:
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms,SerializableClassOfDoom);
byte[] messsize = BitConverter.GetBytes(ms.Length);
ms.Write(messsize, 0, messsize.Length);
ms.Position = 0;
NetworkStream ns = Sock.GetStream();
ms.CopyTo(ns);
}
Обновление:
Для записи 'length' в начало используйте временный поток / байт [].
Пример:
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms,SerializableClassOfDoom);
byte[] data = ms.ToArray();
byte[] messsize = BitConverter.GetBytes(ms.Length);
ms.Position = 0;
ms.Write(messsize, 0, messsize.Length);
ms.Write(data, 0, data.Length);
ms.Position = 0; // again!
NetworkStream ns = Sock.GetStream();
ms.CopyTo(ns);
}
Обновление 2:
Более эффективный способ.
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms,SerializableClassOfDoom);
byte[] messsize = BitConverter.GetBytes(ms.Length);
NetworkStream ns = Sock.GetStream();
ns.Write(messsize, 0, messsize.Length);
ms.Position = 0; // not sure if needed, doc for CopyTo unclear
ms.CopyTo(ns);
}