Я, наконец, решил опубликовать свою проблему, после нескольких часов, потраченных на поиск решений в Интернете и поиск некоторых.
[Контекст проблемы]
Iя разрабатываю приложение, которое будет развернуто в двух частях:
- инструмент XML Importer: его роль заключается в загрузке / чтении XML-файла для заполнения некоторых структур данных, которые впоследствии сериализуются в двоичный файлfile.
- приложение конечного пользователя: оно загрузит двоичный файл, сгенерированный импортером XML, и выполнит некоторые операции с восстановленными структурами данных.
Пока я использую толькоИмпортер XML для обеих целей (то есть сначала я загружаю xml и сохраняю его в двоичный файл, затем снова открываю импортер XML и загружаю свой двоичный файл).
[Актуальная проблема]
Это прекрасно работает, и я могу восстановить все данные, которые у меня были после загрузки XML, , пока я это делаюс той же сборкой моего XML Importer .Это нежизнеспособно, поскольку мне понадобятся как минимум две разные сборки: одна для импортера XML и одна для приложения конечного пользователя.Обратите внимание, что две версии XML Importer, которые я использую для своего тестирования, абсолютно одинаковы в отношении исходного кода и, следовательно, структур данных , единственное различие заключается в номере сборки (для принудительной другой сборки я простодобавить пробел куда-нибудь и построить заново).
Итак, я пытаюсь сделать следующее:
- Создать версию моего XML Importer
- Открыть XMLИмпортер, загрузите файл XML и сохраните полученные структуры данных в двоичный файл
- Перестройте импортер XML
- Откройте недавно созданный импортер XML, загрузите ранее созданный двоичный файл и восстановите мои структуры данных.
В настоящее время я получаю исключение:
SerializationException: Could not find type 'System.Collections.Generic.List`1[[Grid, 74b7fa2fcc11e47f8bc966e9110610a6, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]'.
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadType (System.IO.BinaryReader reader, TypeTag code)
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadTypeMetadata (System.IO.BinaryReader reader, Boolean isRuntimeObject, Boolean hasTypeInfo)
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectInstance (System.IO.BinaryReader reader, Boolean isRuntimeObject, Boolean hasTypeInfo, System.Int64& objectId, System.Object& value, System.Runtime.Serialization.SerializationInfo& info)
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject (BinaryElement element, System.IO.BinaryReader reader, System.Int64& objectId, System.Object& value, System.Runtime.Serialization.SerializationInfo& info)
Для вашей информации (не знаю, полезен он или нет), фактический тип, который он пытается десериализовать, являетсяList, Grid - это пользовательский класс (который корректно сериализуем, как я могу сделать, используя ту же версию XML Importer).
[Потенциальное решение]
Я верю, что это происходит откуда-то из Ассамблеи, так как я читаю много постов и статей об этом.Тем не менее, у меня уже есть пользовательский Binder, который учитывает различия в именах сборок и выглядит так:
public sealed class VersionDeserializationBinder : SerializationBinder
{
public override Type BindToType( string assemblyName, string typeName )
{
if ( !string.IsNullOrEmpty( assemblyName ) && !string.IsNullOrEmpty( typeName ) )
{
Type typeToDeserialize = null;
assemblyName = Assembly.GetExecutingAssembly().FullName;
// The following line of code returns the type.
typeToDeserialize = Type.GetType( String.Format( "{0}, {1}", typeName, assemblyName ) );
return typeToDeserialize;
}
return null;
}
}
, который я назначаю BinaryFormatter перед десериализацией здесь:У кого-нибудь из вас есть идея, как я могу это исправить?Было бы здорово, довольно, пожалуйста:)