我正在创建一个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