我已經序列化了一個曾經在命名空間Temp中的類,但是現在我正在反序列化另一個命名空間(我的意思是當前用於獲取對象的類駐留在另一個命名空間中)。我正面臨無法找到Temp命名空間的錯誤。我發現這個映射很有用: Maintain .NET Serialized data compatability when moving classes。二進制序列化命名空間變化
有什麼辦法只是序列化類對象而不是程序集信息或命名空間信息? (我正在考慮未來的變化並擺脫那個映射)。
我已經序列化了一個曾經在命名空間Temp中的類,但是現在我正在反序列化另一個命名空間(我的意思是當前用於獲取對象的類駐留在另一個命名空間中)。我正面臨無法找到Temp命名空間的錯誤。我發現這個映射很有用: Maintain .NET Serialized data compatability when moving classes。二進制序列化命名空間變化
有什麼辦法只是序列化類對象而不是程序集信息或命名空間信息? (我正在考慮未來的變化並擺脫那個映射)。
最容易處理的是AppDomain.TypeResolve
事件。
當您創建一個BinaryFormatter
來序列化您的數據時,可以將AssemblyFormat
屬性設置爲FormatterAssemblyStyle
。簡單。這將導致只有程序集名稱被序列化,而不是整個版本限定的完整程序集名稱。
您也可以使用SerializationBinder
和BinaryFormatter
。在.NET 4.0中,您可以提供一個BindToName
方法作爲SerializationBinder
的一部分,它允許您在序列化時控制自定義類型名稱映射。
你可以強制新的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);
}
謝謝,它適合我! – 2013-01-28 20:56:29
我不認爲會的序列化幫助目的。 OP描述了他的反序列化問題,現在想要在序列化期間解決問題的起點...... – rene 2011-03-01 09:37:03
@rene:忽略了那部分:)不確定他是否可以做任何事情,但只是爲了讓舊數據冒出來... – leppie 2011-03-01 09:39:49
我並不依賴任何特定的數據,但我想確保這些數據是否將在其他名稱空間中反序列化,它將在沒有任何上述類型的映射的情況下這樣做。 – 2011-03-01 09:45:34