2010-11-16 2 views
18

Я использую BinaryFormatter для сериализации массива экземпляров класса в файл. Я могу десериализовать этот штраф в одном приложении. Когда я пытаюсь тот же десериализации в другом приложении (который тянет в общий файл, который выполняет работу), то я получаю следующее сообщение об ошибке:Как получить BinaryFormatter для десериализации в другом приложении

{"Could not load file or assembly 'pmlscan, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The module was expected to contain an assembly manifest."} 

где pmlscan это имя исходного приложения. Как получить BinaryFormatter, чтобы не пытаться загрузить pmlscan?

ответ

0

Вы не можете!

Лучший вариант - опубликовать сериализуемые классы в отдельной сборке, и вы обратитесь к нему на сервере (сериализаторе) и клиенте (десериализатор). Таким образом, вы не публикуете весь свой исходный код для внешнего мира.

+3

Вы говорите о .Net здесь. Все возможно. (Хотя отдельная сборка самая простая). – GvS

+0

Проблема не в загрузке и сбое. Вопрос: «Не пытайтесь загружать pmlscan». – Aliostad

+0

С помощью assemblyRedirect вы не пытаетесь загрузить pmlscan. Но сказать «Ты не можешь!», Это неправильно. Так как это сложный вопрос, я прощаю вас и не сдул вам за это ;-) – GvS

3

Бинарный сериализатор кодирует информацию о классе и сборке в двоичный массив. Когда вы десериализуете этот массив, десериализатор использует эту информацию для поиска сборки, в которой находится класс, и (при необходимости) загружает сборку в ваш домен приложения. Если другое приложение не имеет доступа к сборке, в которой находится тип класса, вы увидите ошибку, которую вы получаете.

Как упомянуто другим плакатом, поместите эти общие классы в общую сборку и разверните их в клиент/другое приложение, а также в серверное приложение.

+0

My +1, sir ... – Aliostad

+2

Ну, вы можете всегда разрешать другую сборку и совместимый тип для десериализации. Это работает, но не для слабонервных. – leppie

2

Если классы одинаковы, и это просто еще одна сборка, вы можете попробовать добавить раздел assemblyBinding в файл .config.

Вы также должны прочитать статью о Resolving Assembly Loads и TypeResolve event.

Используя эти методы, вы можете перенаправить систему .Net на другой тип при десериализации.

Примечание: Перенос ваших общих классов в общую .dll будет более простым решением.

1
sealed class PreMergeToMergedDeserializationBinder : SerializationBinder 
{ 
    public override Type BindToType(string assemblyName, string typeName) 
    { 
     return Type.GetType("BinarySerialization.YourClass"); 
    } 
} 
BinaryFormatter bfDeserialize = new BinaryFormatter(); 
bfDeserialize.Binder = new PreMergeToMergedDeserializationBinder(); 
while (fsRead.Position < fsRead.Length) 
{ 
    YourClass sibla = (YourClass)bfDeserialize.Deserialize(fsRead); 
} 

Предполагая, что у вас есть ехе, что сериализующий данные в вашем «YourClass» и еще один ехе, что десериализует объекты YourClass.

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

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