2011-03-01 28 views
3

我已經序列化了一個曾經在命名空間Temp中的類,但是現在我正在反序列化另一個命名空間(我的意思是當前用於獲取對象的類駐留在另一個命名空間中)。我正面臨無法找到Temp命名空間的錯誤。我發現這個映射很有用: Maintain .NET Serialized data compatability when moving classes二進制序列化命名空間變化

有什麼辦法只是序列化類對象而不是程序集信息或命名空間信息? (我正在考慮未來的變化並擺脫那個映射)。

回答

2

最容易處理的是AppDomain.TypeResolve事件。

+1

我不認爲會的序列化幫助目的。 OP描述了他的反序列化問題,現在想要在序列化期間解決問題的起點...... – rene 2011-03-01 09:37:03

+0

@rene:忽略了那部分:)不確定他是否可以做任何事情,但只是爲了讓舊數據冒出來... – leppie 2011-03-01 09:39:49

+0

我並不依賴任何特定的數據,但我想確保這些數據是否將在其他名稱空間中反序列化,它將在沒有任何上述類型的映射的情況下這樣做。 – 2011-03-01 09:45:34

2

當您創建一個BinaryFormatter來序列化您的數據時,可以將AssemblyFormat屬性設置爲FormatterAssemblyStyle。簡單。這將導致只有程序集名稱被序列化,而不是整個版本限定的完整程序集名稱。

您也可以使用SerializationBinderBinaryFormatter。在.NET 4.0中,您可以提供一個BindToName方法作爲SerializationBinder的一部分,它允許您在序列化時控制自定義類型名稱映射。

4

你可以強制新的Type在你自己的Binder中重寫該方法。 (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationbinder.aspx

例如,你可以定義下面的類:

sealed class MyBinder : SerializationBinder 
{ 
    private readonly Type _type; 

    public MyBinder(Type type) 
    { 
     _type = type; 
    } 

    public override Type BindToType(string assemblyName, string typeName) 
    { 
     return _type; 
    } 
} 

,然後固化粘合劑在BinaryFormatter的

var formatter = new BinaryFormatter(); 

formatter.Binder = new MyBinder(typeof(YourClass)); 

using (var stream = new MemoryStream(bytes)) 
{ 
    YourClass yourobject = formatter.Deserialize(stream); 
} 
+1

謝謝,它適合我! – 2013-01-28 20:56:29

相關問題