0

以下のようなカスタム コレクション タイプがあります。

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.KeyValuePair2[System.Int32,System.String]" は、このジェネリック コレクションでは使用できません。パラメータ名: 値

ノート

MyClass で KeyValuePairCollection(Of Integer, String) の代わりに List(Of KeyValuePair(Of Integer, String)) を使用すると、すべて問題ありません

4

1 に答える 1

0

andを呼び出すときにIntegerandのキーと値のペアを使用しているため、一致することはありません。StringRegisterConvertersCustomConverterString, Object

したがって、Deserialize メソッドを変更したい場合がありますが、拡張すると問題が発生し、拡張JavaScriptConverterせずに実行する必要があると思いますが、VB.NET ではなく C# でこれを行うため、最善を尽くしているかどうかはわかりませんアプローチ。

于 2011-03-21T17:45:38.930 に答える