Ответ 1
Вы можете добиться этого, используя пользовательский SerializationBinder. См. Здесь: Расширенная двоичная сериализация: десериализация объекта в другой тип, чем тот, который был сериализован в
Я использую 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?
Вы можете добиться этого, используя пользовательский SerializationBinder. См. Здесь: Расширенная двоичная сериализация: десериализация объекта в другой тип, чем тот, который был сериализован в
Двоичный сериализатор кодирует информацию о классе и сборке в двоичный массив. Когда вы десериализуете этот массив, десериализатор использует эту информацию для поиска сборки, в которой находится класс, и (при необходимости) загружает сборку в ваш домен приложения. Если другое приложение не имеет доступа к сборке, в которой находится тип класса, вы увидите ошибку, которую вы получаете.
Как упоминалось еще одним плакатом, поместите эти общие классы в общую сборку и разверните их в клиентском/другом приложении, а также в серверном приложении.
Если классы одинаковы, и это просто еще одна сборка, вы можете попробовать добавить assemblyBinding в файл .config.
Вы также должны прочитать статью о "Разрешить загрузку сборок" и TypeResolve событие.
Используя эти методы, вы можете перенаправить систему .Net на другой тип при десериализации.
Примечание. Миграция ваших общих классов в общую .dll будет более простым решением.
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.
Вы не можете!
Лучший вариант - опубликовать сериализуемые классы в отдельной сборке, и вы ссылаетесь на него на сервере (serializer) и на клиенте (десериализатор). Таким образом, вы не публикуете весь свой исходный код для внешнего мира.