Десериализация типов из двоичного файла в другое пространство имен в другом приложении (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, и это работает!
Ссылка на вопрос, содержащая золотую информацию, все, что вам нужно знать для этого, и пример кода. Как анализировать содержимое потока двоичной сериализации?