我有一个自定义集合类型,如下所示:
Namespace Collections
Public Class KeyValuePairCollection(Of TKey, TValue)
Inherits List(Of KeyValuePair(Of TKey, TValue))
Public Sub New()
MyBase.New()
End Sub
Friend Sub New(ByVal innerCollection As IEnumerable(Of KeyValuePair(Of TKey, TValue)))
Me.New()
Me.AddRange(innerCollection)
End Sub
Public Overloads Sub Add(ByVal key As TKey, ByVal value As TValue)
Dim item As New KeyValuePair(Of TKey, TValue)(key, value)
MyBase.Add(item)
End Sub
End Class
End Namespace
我想使用自定义 JavascriptConverter 从 JSON 反序列化这种类型的实例
Public Class CustomConverter(Of TKey, TValue)
Inherits JavaScriptConverter
Public Overrides ReadOnly Property SupportedTypes() As IEnumerable(Of Type)
Get
Return New ReadOnlyCollection(Of Type)(New List(Of Type) _
(New Type() {GetType(KeyValuePairCollection(Of TKey, TValue))}))
End Get
End Property
Public Overrides Function Serialize(ByVal obj As Object, _
ByVal serializer As JavaScriptSerializer) As IDictionary(Of String, Object)
Throw New NotSupportedException("This class can be used only for deserialization.")
End Function
Public Overrides Function Deserialize(ByVal dictionary As IDictionary(Of String, Object), _
ByVal type As Type, ByVal serializer As JavaScriptSerializer) As Object
Return Nothing
End Function
End Class
反序列化代码:
Dim serializer As New JavaScriptSerializer
serializer.RegisterConverters(New CustomConverter(){New CustomConverter(Of Integer, String)})
serializer.Deserialize(Of MyClass)(serializedObject)
MyClass 有一个 KeyValuePairCollection 类型的字段。当我调试此代码并将断点设置为 Deserialize 方法时...永远不会调用此方法。我只是得到以下异常:
值“System.Collections.Generic.Dictionary
2[System.String,System.Object]" is not of type "System.Collections.Generic.KeyValuePair
2[System.Int32,System.String]”不能在此通用集合中使用。参数名称:值
笔记
当我在 MyClass 中使用 List(Of KeyValuePair(Of Integer, String)) 而不是 KeyValuePairCollection(Of Integer, String) 时,一切都很好