Подтвердить что ты не робот

Как получить 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?

4b9b3361

Ответ 2

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

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

Ответ 3

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

Вы также должны прочитать статью о "Разрешить загрузку сборок" и TypeResolve событие.

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

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

Ответ 4

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);
}

Предполагая, что у вас есть exe, который сериализует данные в вашем "YourClass" и другом exe, который де-сериализует объекты YourClass.

Ответ 5

Вы не можете!

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