2011-03-21 6 views
0

J'ai un type de collection personnalisé comme ci-dessous:JavascriptDeserializer pour collection personnalisée

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 

Je veux désérialiser instances de ce type de JSON en utilisant JavascriptConverter custom

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 

Code Désérialisation:

Dim serializer As New JavaScriptSerializer 
serializer.RegisterConverters(New CustomConverter(){New CustomConverter(Of Integer, String)}) 
serializer.Deserialize(Of MyClass)(serializedObject) 

MyClass a un champ de type KeyValuePairCollection. Lorsque je débogue ce code et que j'applique le point d'arrêt à la méthode de désérialisation ... cette méthode n'est jamais appelée. Je reçois juste après exception:

La valeur "System.Collections.Generic.Dictionary 2[System.String,System.Object]" is not of type "System.Collections.Generic.KeyValuePair 2 [System.Int32, System.String]" et ne peut pas être utilisé dans cette collection générique. Nom du paramètre: Valeur

NOTE

Tout va bien quand j'utilise List (Of KeyValuePair (Of Integer, String)) au lieu de KeyValuePairCollection (Of Integer, String) dans MyClass

Répondre

0

Vous utilisez la paire valeur/clé de Integer et String lorsque vous appelez RegisterConverters et CustomConverter que vous recherchez String, Object, donc il ne peut pas être apparié. Donc, vous voudrez peut-être changer votre méthode de désérialisation, mais je pense que vous aurez des problèmes à le faire en prolongeant JavaScriptConverter et vous devrez peut-être le faire sans extension, mais, je le fais avec C# pas VB.NET, donc je Je ne suis pas sûr de votre meilleure approche.

+0

Merci pour la réponse. Mais je ne suis pas sûr de comprendre ... Pourriez-vous le clarifier? Pourquoi aurais-je des problèmes d'utilisation de JavascriptConverter? Comment puis-je désérialiser ma collection sans classe JavascriptConverter? Pourriez-vous donner un exemple sur C#, s'il vous plaît? – Egor4eg

Questions connexes