Нет идентификатора сборки для типа объекта 'ImagePacket'. Исключение сериализации поймано C#
Я отправляю сериализованный большой объект изображения через сокет UDP. Когда я записываю все полученные байты в поток памяти и передаю объект потока памяти для десериализации, он генерирует исключение Нет идентификатора сборки для типа объекта 'ImagePacket'.
Код конца получателя:
ImageStream = new MemoryStream();
while (AccumulatingBytes <= TotalSizeOfComplexObject)
{
byte[] Recievedbytes = UdpListener.Receive(ref RemoteEndPoint);
ImageStream.Write(Recievedbytes, 0, Recievedbytes.Length);
AccumulatingBytes += Recievedbytes.Length;
}
ImageStream.Position = 0;
imagecontainer = (ImageContainer)bformater.Deserialize(ImageStream);//Here the Code Segment Breaks and Exception thrown
1 ответ
Я подозреваю, что проблема здесь просто: вы используете UDP как TCP. UDP основывается на пакетах, но a: не гарантирует, что пакеты будут доставлены по порядку, а b: не гарантирует, что пакеты не будут отброшены или дублированы.
Я полностью ожидаю, что у вас есть некоторые из строя. Если вы отправляете несколько сообщений, возможно, что некоторые из них были отброшены, и вы включили несколько из следующего сообщения.
Чтобы использовать сеть так, как хочет ваш код: используйте TCP. В противном случае ответственность за определение неупорядоченных, отброшенных и дублированных пакетов лежит полностью на вас. Это может быть, например, путем добавления порядкового номера к пакету и отслеживания того, что было получено - переупорядочивание их по мере необходимости, удаление дубликатов и повторный запрос любого, который умер в пути. В основном, переписывая все, что добавляет TCP! Если у вас нет очень специфического сценария, есть хороший шанс, что стек TCP (с поддержкой NIC и уровня ОС) справится с этим лучше, чем вы.