Десериализация типов из двоичного файла в другое пространство имен в другом приложении (C# .NET)

В приложении под названием "application1" я сериализую эту структуру в двоичную форму:

namespace namespace1
{ 
[System.Serializeable]
class ClassA
   { 
     List<ClassB> List 
   } 
}

В приложении под названием "application2" я должен десериализовать этот двоичный файл, но мои ClassA и ClassB должны быть внутри namespace2 вместо namespace1.

Поэтому я написал связыватель сериализации:

public class TypeNameConverter : SerializationBinder
    {
        public override Type BindToType(string assemblyName, string typeName)
        {
            assemblyName = Assembly.GetExecutingAssembly().FullName;

            if (typeName.Contains("nemespace1."))
                typeName = typeName.Replace("nemespace1.", "nemespace2.");

            Type retType = Type.GetType(string.Format("{0}, {1}", typeName, assemblyName));
            return retType;
        }
    }

и я использую это так:

 binaryFormatter.Binder = new TypeNameConverter();
 (T)binaryFormatter.Deserialize(memoryStream);

И это успешно десериализует namespace1.ClassA в namespace2.ClassA, но не дает возможности дальнейшей десериализации списка od nemespace1.ClassB в список namespace2.ClassB. Я предполагаю, что это не удается, потому что список ClassB инкапсулирован в ClassA, и функция BindToType () не вызывается для "внутренних элементов", она вызывается только один раз для ClassA, затем пытается десериализовать ClassA и не может извлечь список ClassB с ошибкой:

 SerializationException: Could not find type
    'System.Collections.Generic.List`1[[namespace1.ClassB, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]'.

Я не могу вносить какие-либо корректировки в приложение1 (не могу изменить способ сериализации), я могу только настроить логику десериализации в приложении2.

Я пытаюсь найти решение для этой конкретной проблемы, у кого-то была похожая проблема или, может быть, идея, как решить эту проблему?

Спасибо!

1 ответ

Единственное решение проблемы, которую я нашел, - это ручное изменение типа внутри уже сериализованного двоичного файла. Это включает чтение двоичного файла, который содержит сериализованные объекты типа namespace1.ClassA, поиск байтов в двоичном файле, представляющих строку, которая определяет тип (то есть "namespace1.ClassA"), и замену этих байтов строкой "namespace2.ClassA", таким образом заставляя десериализатор думать, что сериализованный объект имеет тип namespace2.ClassA вместо namespace1.ClassA, и это работает!

Ссылка на вопрос, содержащая золотую информацию, все, что вам нужно знать для этого, и пример кода. Как анализировать содержимое потока двоичной сериализации?

Другие вопросы по тегам