У меня есть приложение, настроенное на отправку объектов по сети путем их сериализации в XML на стороне отправки и десериализации на стороне получателя. Сначала я настроил его с помощью UDP, который работал нормально. Код так:
Отправитель:
MemoryStream ms = new MemoryStream();
dataSerializer.Serialize(ms, dataToSend, serNamespaceRemover);
senderClient.Send(ms.GetBuffer(), (int)ms.Length);
Получатель:
IPEndPoint beaconEndpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), SharedData.udpPort);
byte[] receiveData = beaconClient.Receive(ref beaconEndpoint);
MemoryStream ms = new MemoryStream(receiveData);
CommData recieved = dataDeserializer.Deserialize(ms) as CommData;
Теперь мне нужно переключить его на использование TCP. Отправитель, кажется, работает нормально и впечатляюще прост:
dataSerializer.Serialize(senderClient.GetStream(), dataToSend, serNamespaceRemover);
Но у меня проблемы с приемником. Я попробовал простую и очевидную вещь:
NetworkStream netstr = client.GetStream();
CommData data = dataDeserializer.Deserialize(netstr) as CommData;
И я получаю исключение: в XML-документе есть ошибка (5, 14). XML выглядит так:
<?xml version="1.0"?>
<CommData>
<RigName>Rig 100</RigName>
<IsShutDown>false</IsShutDown>
</CommData>
Таким образом, позиция 5,14 — это 2 символа после окончания полученных данных. Я прочитал данные в массив символов и подтвердил, что после конца закрывающей скобки ничего нет, поэтому я не уверен, о чем говорит десериализатор.
Между тем, если я делаю это, то приемник работает:
NetworkStream netstr = client.GetStream();
byte[] arry = new byte[client.Available];
netstr.Read(arry, 0, client.Available);
MemoryStream ms = new MemoryStream(arry);
CommData data = dataDeserializer.Deserialize(ms) as CommData;
Это кажется безумием. Почему он не может просто читать напрямую из NetworkStream? Мне действительно нужно читать данные в MemoryStream, а затем передавать их десериализатору?