【发布时间】:2015-10-09 20:44:52
【问题描述】:
我正在创建一个 vb.net 应用程序,该应用程序需要能够反序列化在不同应用程序中序列化的文件以及序列化可以在其他应用程序中反序列化的文件。
我正在尝试通过使用 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
If 语句为真,因此 assemblyName 和 typeName 设置正确。但是 returnType 没有设置 - 它仍然是 Nothing。我也不知道为什么。
请注意,我在两个应用程序中确实拥有所有相同的类(即 Count,这是在它们之间进行序列化/反序列化的类型)。
谢谢!
【问题讨论】:
-
不是没有,但是你可以通过使用Protobuf-Net而不是BinaryFormatter来避免程序集之间共享数据的问题。与 BF 不同,它不会将程序集文化类信息编码到输出中
-
typeName = "Count"仅用于演示目的吗?我相信通常它会有一个命名空间限定符。即typeName = "rootNamespace.Count" -
@TnTinMn - “Count”是正在序列化/反序列化的对象类型。当您在自己的命名空间中引用对象类型时,您不必在前面指定命名空间。我更改了“从其他应用程序输入”的文本,这可能有助于更清晰。
-
@Andarta - 来自documentation for Type.GetType,“要获取的类型的程序集限定名称。...如果该类型在当前执行的程序集中或在Mscorlib.dll中,就足够了提供由其命名空间限定的类型名称。"
-
@TnTinMn - 这无助于 returnType 没有被设置为任何东西并且保持 Nothing 的问题。此外,我试图反序列化的类型来自不同的程序集……我是否必须确保返回的类型指定了我正在运行的程序集才能使其正常工作?
标签: vb.net serialization type-conversion deserialization