2015-04-30 5 views
1

Я встречая действительно странное исключение на одном из моего приложения (впоследствии ссылаться как ApplicationB)Weird BinaryFormatter ошибка deseralization в C#

`Unable to find assembly 'MsgPack, Version=0.5.0.0, Culture=neutral, PublicKeyToken=a2625990d5dc0167'.` 

Вот мой сценарий, на мой ApplicationA я сериализовать объект, используя MsgPack, и сохраните его в Redis с помощью SE.Redis. Позже я запрашиваю этот объект и десериализую его (конечно, все еще используя MsgPack). Как только это будет сделано, я отправляю этот объект через TCP/Componennt, который сериализует этот же объект с помощью BinaryFormatter. С другой стороны, т.е. на ApplicationB, как только пакет прибыл, он десериализуется с использованием BinaryFormatter, и именно здесь я получаю исключение.

У меня нет никакого контроля над TCP/Component и используемым сериализатором.

Так почему я получу эту ошибку на ApplicationB, который должен знать что-нибудь о MsgPack?

Просто мысль, которую я хочу поделиться, кажется, что MsgPack создает на лету DataContract и при десериализации он может применять некоторые атрибуты для объекта, который конфликтует с BinaryFormatter. Конечно, я не уверен в этом.

Но кто-нибудь столкнулся с этой проблемой?

Cheers.

EDIT: Я заметил, что для члена типа объекта MsgPack добавляет много членов для определения хранилища типов в члене объекта (например, IsDictionary, IsList и т. Д.). Это влияет на BinaryFormatter?

+2

Это простая ошибка «файл не найден». С самой очевидной причиной, что MsgPack.dll отсутствует в пробном пути ApplicationB. Или у него неправильная версия. Используйте Fuslogvw.exe для устранения неполадок с разрешением сборки. –

+0

Мне не нужен MsgPack.dll на ** ApplicationB **, и он не должен даже знать о MsgPack. –

+2

Ну, конечно, да. Он кричит на вас громко. –

ответ

3

При использовании двоичной сериализации только массивное имя типа и его данные сериализуются в байтовый массив. Сериализатор с другой стороны хочет десериализовать свои данные. Сначала он считывает имя типа из байтового массива и пытается найти и инициализировать этот тип. Этот тип должен быть где-то в DLL. Поэтому он ищет данную DLL (в вашем случае MsgPack), но ее не найти. Таким образом: Убедитесь, что DLL MsgPack находится с обеих сторон.

Если у вас нет DLL с другой стороны, вы можете попытаться выполнить сериализацию самой DLL и отправить ее на другую сторону. Сначала десериализуйте DLL, поместите его в папку bin или загрузите в память, затем десериализуйте тип с его данными. Но вы действительно должны действительно убедиться, что вы хотите это сделать. Я бы не стал.

Вы когда-нибудь рассматривали возможность связи между AppA en AppB с использованием WCF?

 Смежные вопросы

  • Нет связанных вопросов^_^