Исключение BinaryFormatter - PullRequest
       13

Исключение BinaryFormatter

8 голосов
/ 10 апреля 2011

Я пытаюсь переместить граф объектов из процесса сервера на клиент.И это работает.По крайней мере, это работает, когда и клиент, и сервер находятся на моей виртуальной машине dev.Это также работает, когда я запускаю сервер на моей базовой машине (клиент на dev vm).

Однако он перестает работать, когда я запускаю сервер на своем ПК медиацентра.Исключение:

Двоичный поток '0' не содержит допустимого BinaryHeader.Возможные причины: неверное изменение потока или версии объекта между сериализацией и десериализацией.

Все три компьютера являются компьютерами под управлением Windows 7 x64.Я использую TCPClient и TCPListener вместе с классом BinaryFormatter для выполнения тяжелой работы.

Передаваемые данные считываются из файла с использованием стандартного объекта FileStream.

Еслина стороне клиента я сериализую буферы в файл, содержимое (в соответствии с BeyondCompare) на самом деле, кажется, отличается?.

Я могу опубликовать код, но я не уверен, где находится проблемная область?Есть идеи?

1 Ответ

1 голос
/ 10 апреля 2011

Обновление: похоже, я решил эту проблему.У меня была точка останова, когда клиент прочитал ответ сервера

tcpClient.GetStream().Read(buffer, 0, buffer.Length);

и заметил, что с «проблемного» сервера было прочитано меньше байтов.После быстрого Google я нашел эту статью http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/759f3f2f-347b-4bd8-aa05-fb7f681c3426, в которой Дейв Мюррей предлагает:

Есть несколько способов справиться с этим более элегантно.Если вы не планируете повторно использовать соединение для чего-то еще, самое простое - это то, что предлагает nobugz.Когда сервер завершит отправку данных, у него будет Close (), это конец соединения.Когда клиент прочитает все данные, отправленные до закрытия, чтение начнет возвращать 0, после чего вы знаете, что сервер не планирует отправлять что-либо еще.

Итак, я обновил свой код спрочитал один раз:

var buffer = new byte[32768];
var totalBytesRead = 0;
var bytesRead = tcpClient.GetStream().Read(buffer, 0, buffer.Length);

do
{
      totalBytesRead += bytesRead;
      bytesRead = tcpClient.GetStream().Read(buffer, totalBytesRead, bytesRead);

} while (bytesRead > 0);

и обновил код моего сервера, чтобы закрыть соединение согласно посту.И согласно комментарию от @leppie, я, вероятно, могу удалить свои свойства в оболочке Base64 ...

...