我正在創建一個vb.net應用程序,它需要能夠反序列化在不同應用程序中序列化的文件以及序列化可以在其他應用程序中反序列化的文件。Type.GetType在SerializationBinder中返回Nothing
我想通過使用SerializationBinder在序列化/反序列化期間轉換類型使這項工作。使用This article from MSDN作爲參考,這是我在這一點....
在我的反序列化功能:
myDeserializer.Binder = New TypeConverter()
openCount = DirectCast(myDeserializer.Deserialize(stream), Count)
然後:
Class TypeConverter
Inherits SerializationBinder
Public Overrides Function BindToType(assemblyName As String, typeName As String) As Type
Dim returnType As Type = Nothing
If assemblyName = "[name from other application]" Then
assemblyName = Assembly.GetExecutingAssembly().FullName
End If
If typeName = "[other application namespace].Count" Then
typeName = "Count"
End If
returnType = Type.GetType(String.Format("{0}, {1}", typeName, assemblyName))
Return returnType
End Function
End Class
的如果陳述是真實的,所以assemblyName和typeName正確設置。但是returnType沒有被設置 - 它仍然沒有。我不知道爲什麼。
請注意,我在兩個應用程序中都有相同的類(即Count,這是它們之間序列化/反序列化的類型)。
謝謝!
不是沒有,但你可以通過使用[protobuf網]避免組件之間共享數據的問題(https://www.nuget.org/packages/protobuf-net /)而不是BinaryFormatter。與BF不同,它不會將彙編文化級信息編碼到輸出中 – Plutonix
是'typeName =「Count」'僅用於演示目的嗎?我相信通常它會有一個命名空間限定符。即'typeName =「rootNamespace.Count」' – TnTinMn
@TnTinMn - 「Count」是被序列化/反序列化的對象類型。當您在自己的名稱空間中引用對象類型時,不必在前面指定名稱空間。我改變了「從其他應用程序類型」的文字,這可能有助於更清楚地說明。 – Andarta