2014-09-06 4 views
4

Я использовал BinaryFormatter для хранения настроек моего приложения. Теперь, спустя несколько лет в продолжение разработки, после того, как многие пользователи уже используют мое приложение, я хочу изменить, как несколько классов называются и в каких пространствах имен они расположены. Однако, если я это сделаю, больше невозможно загрузить настройки, потому что BinaryFormater называет вещи своими именами в коде.Возможно ли восстановить объект, сериализованный через «BinaryFormatter» после изменения имен классов?

Так, например, если я изменяю MyNamespace.ClassOne на MyNamespace.Class.NumberOne в коде, я больше не могу загружать настройки, потому что MyNamespace.ClassOne больше не существует.

Я хотел бы сделать это и разрешить пользователям сохранять свои файлы настроек. Это возможно?

Я имею в виду, я думаю, что я могу изучить формат, в котором он был сохранен, и вручную изменить двоичный файл, заменив имена классов, но это будет подход хакера. Должен быть нормальный подход к этому, не так ли?

+0

Существуют и другие бинарные сериализаторы, которые являются агностиками класса-культуры. ProtoBuf-net - один, и я думаю, что NetSerializer в CodeProject тоже. – Plutonix

ответ

8

Да, это возможно. Вы можете использовать класс SerializationBinder. Что-то вроде этого: пример

public class ClassOneToNumberOneBinder : SerializationBinder 
{ 
    public override Type BindToType(string assemblyName, string typeName) 
    { 
     typeName = typeName.Replace(
      "MyNamespace.ClassOne", 
      "MyNamespace.Class.NumberOne"); 

     assemblyName = assemblyName.Replace("MyNamespace", "MyNamespace.Class"); 

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

BinaryFormatter binaryFormatter = new BinaryFormatter(); 
binaryFormatter.Binder = new ClassOneToNumberOneBinder(); 

Код адаптировано из this answer.