JavascriptDeserializer для пользовательской коллекции - PullRequest
0 голосов
/ 21 марта 2011

У меня есть пользовательский тип коллекции, как показано ниже:

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

Я хочу десериализовать экземпляры этого типа из JSON, используя пользовательский JavascriptConverter

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. Когда я отлаживаю этот код и устанавливаю точку останова для метода десериализации ... этот метод никогда не вызывается. Я просто получаю следующее исключение:

значение "System.Collections.Generic.Dictionary 2[System.String,System.Object]" is not of type "System.Collections.Generic.KeyValuePair 2 [System.Int32, System.String]" и не может быть использован в этом родовом коллекция. Имя параметра: значение

Примечание

Все нормально, когда я использую List (Of KeyValuePair (Of Integer, String)) вместо KeyValuePairCollection (Of Integer, String) в MyClass

1 Ответ

0 голосов
/ 21 марта 2011

Вы используете пару значений ключа Integer и String, когда вы звоните RegisterConverters, а в CustomConverter вы ищете String, Object, поэтому она не может быть сопоставлена.

Итак, вы можете захотеть изменить свой метод десериализации, но я думаю, у вас возникнут проблемы с этим путем расширения JavaScriptConverter, и вам может потребоваться сделать это без расширения, но я делаю это с C #, а не с VB.NET, поэтому я неуверен, что ваш лучший подход.

...