2014-09-06 59 views
4

我正在使用BinaryFormatter來存儲我的應用程序設置。現在,經過幾年的持續發展,在許多用戶已經使用我的應用程序之後,我想更改幾個類的命名方式以及它們所在的命名空間。但是,如果我這樣做,則不能再加載設置,因爲BinaryFormater通過其代碼內名稱來調用事物。在更改類名後,是否可以通過「BinaryFormatter」序列化對象?

因此,例如,如果我在代碼中將MyNamespace.ClassOne更改爲MyNamespace.Class.NumberOne,我無法再加載設置,因爲MyNamespace.ClassOne不再存在。

我想同時進行此更改並允許用戶保留其設置文件。這可能嗎?

我的意思是,我想我可以研究它保存的格式,並手動修改二進制文件,替換類名,但那會是黑客的方法。必須有一個正常的方法來解決這個問題,對吧?

+0

還有其他類型文化組裝不可知的二進制串行器。 ProtoBuf-net就是其中之一,我認爲CodeProject上的NetSerializer也是如此。 – Plutonix 2014-09-06 14:55:15

回答

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

相關問題