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
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