我正在创建一个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语句为true,因此正确设置了assemblyName和typeName。但是returnType没有设置 - 它仍然没有。我不明白为什么。
请注意,我在两个应用程序中都有相同的类(即Count,它们之间是序列化/反序列化的类型)。
谢谢!
答案 0 :(得分:0)
好的,事实证明,在这种情况下(在此用途中使用Type.GetType),除非在类型之前指定命名空间,否则它不起作用。所以,我typeName = "Count"
我需要将其更改为typeName = "[my project].Count"
。 https://msdn.microsoft.com/en-us/library/a87che9d%28v=vs.110%29.aspx
事实证明,此函数会针对每种类型重复(不仅仅是特定的反序列化,而是针对每种类型的属性)。因此,我的"伯爵" type包含其他自定义类型的属性,还有一些是其他自定义类型的列表,我必须确保每个都正确转换。
我现在所处的位置是:在完成整个过程中,看起来一切顺利。但是在它转换了第一个类型是自定义类型结构的列表之后,在尝试转换下一个类型时,我得到了一个参数异常。
这是现在的代码:
Public Overrides Function BindToType(assemblyName As String, typeName As String) As Type
If assemblyName.Contains("[other project]") Then
assemblyName = Assembly.GetExecutingAssembly().FullName
End If
If typeName.Contains("System.Collections.Generic.List`1[[[Other Project].[Type],") Then
typeName = String.Format("System.Collections.Generic.List`1[[[my project].[type]], {0}", Assembly.GetExecutingAssembly().FullName)
ElseIf typeName.Contains("System.Collections.Generic.List`1[[[Other Project].[type]+[structure],") Then
typeName = String.Format("System.Collections.Generic.List`1[[[My project].[Type]+[Structure], {0}", Assembly.GetExecutingAssembly().FullName)
ElseIf typeName.Contains("[Other Project]") Then
typeName = Replace(typeName, "[Other Project]", "[My Project]")
End If
Return Type.GetType(String.Format("{0}, {1}", typeName, assemblyName))
End Function
所以 System.Collections.Generic.List`1 [[[我的项目]。[类型] + [结构] 是自定义类型结构的列表。第一个它似乎转换得很好,但是当试图转换下一个,我得到这个:
附加信息:类型对象 ' System.Runtime.Serialization.TypeLoadExceptionHolder'不可能是 转换为类型 ' System.Collections.Generic.List`1 [我的项目。类型+结构]'。
在这种情况下,Type和Structure是先前转换的类型...而不是抛出此异常时当前正在转换的类型。
不知道这里发生了什么......