JavaScriptConverter Класс

Определение

Предоставляет абстрактный базовый класс для пользовательского преобразователя типов.

public ref class JavaScriptConverter abstract
public abstract class JavaScriptConverter
type JavaScriptConverter = class
Public MustInherit Class JavaScriptConverter
Наследование
JavaScriptConverter

Примеры

В следующем примере показано, как создать пользовательский преобразователь для ListItemCollection класса.

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Web.UI.WebControls;
using System.Collections;

namespace System.Web.Script.Serialization.CS
{
    public class ListItemCollectionConverter : JavaScriptConverter
    {

        public override IEnumerable<Type> SupportedTypes
        {
            //Define the ListItemCollection as a supported type.
            get { return new ReadOnlyCollection<Type>(new List<Type>(new Type[] { typeof(ListItemCollection) })); }
        }

        public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            ListItemCollection listType = obj as ListItemCollection;

            if (listType != null)
            {
                // Create the representation.
                Dictionary<string, object> result = new Dictionary<string, object>();
                ArrayList itemsList = new ArrayList();
                foreach (ListItem item in listType)
                {
                    //Add each entry to the dictionary.
                    Dictionary<string, object> listDict = new Dictionary<string, object>();
                    listDict.Add("Value", item.Value);
                    listDict.Add("Text", item.Text);
                    itemsList.Add(listDict);
                }
                result["List"] = itemsList;

                return result;
            }
            return new Dictionary<string, object>();
        }

        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            if (dictionary == null)
                throw new ArgumentNullException("dictionary");

            if (type == typeof(ListItemCollection))
            {
                // Create the instance to deserialize into.
                ListItemCollection list = new ListItemCollection();

                // Deserialize the ListItemCollection's items.
                ArrayList itemsList = (ArrayList)dictionary["List"];
                for (int i=0; i<itemsList.Count; i++)
                    list.Add(serializer.ConvertToType<ListItem>(itemsList[i]));

                return list;
            }
            return null;
        }
    }
}
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.Web.UI.WebControls
Imports System.Collections

Namespace System.Web.Script.Serialization.VB

    Public Class ListItemCollectionConverter
        Inherits JavaScriptConverter

        Public Overrides ReadOnly Property SupportedTypes() As _
            System.Collections.Generic.IEnumerable(Of System.Type)
            Get
                ' Define the ListItemCollection as a supported type.
                Return New ReadOnlyCollection(Of Type)(New List(Of Type) _
                (New Type() {GetType(ListItemCollection)}))
            End Get
        End Property

        Public Overrides Function Serialize(ByVal obj As Object, _
            ByVal serializer As JavaScriptSerializer) As _
            System.Collections.Generic.IDictionary(Of String, Object)

            Dim listType As ListItemCollection = CType(obj, ListItemCollection)

            If Not (listType Is Nothing) Then

                ' Create the representation.
                Dim result As New Dictionary(Of String, Object)

                Dim itemsList As New ArrayList()
                Dim item As ListItem
                For Each item In listType
                    ' Add each entry to the dictionary.
                    Dim listDict As New Dictionary(Of String, Object)
                    listDict.Add("Value", item.Value)
                    listDict.Add("Text", item.Text)
                    itemsList.Add(listDict)
                Next item
                result("List") = itemsList

                Return result
            End If
            Return New Dictionary(Of String, Object)
        End Function

        Public Overrides Function Deserialize(ByVal dictionary As _
            System.Collections.Generic.IDictionary(Of String, Object), _
            ByVal type As System.Type, ByVal serializer As JavaScriptSerializer) As Object

            If dictionary Is Nothing Then
                Throw New ArgumentNullException("dictionary")
            End If

            If type Is GetType(ListItemCollection) Then
                ' Create the instance to deserialize into.
                Dim list As New ListItemCollection()

                ' Deserialize the ListItemCollection's items.
                Dim itemsList As ArrayList = CType(dictionary("List"), ArrayList)
                Dim i As Integer
                For i = 0 To itemsList.Count - 1
                    list.Add(serializer.ConvertToType(Of ListItem)(itemsList(i)))
                Next i

                Return list
            End If

            Return Nothing

        End Function
    End Class
End Namespace

Комментарии

Класс JavaScriptConverter позволяет реализовать процессы сериализации и десериализации для управляемых типов, которые изначально не поддерживаются классом JavaScriptSerializer . Вы также можете использовать JavaScriptConverter , если требуется больше контроля над процессом сериализации и десериализации.

Свойство SupportedTypes указывает типы, для которых пользовательский преобразователь предоставляет службы преобразователя.

Чтобы указать, что пользовательский преобразователь должен использоваться экземпляром JavaScriptSerializer , необходимо зарегистрировать преобразователь в экземпляре. Если вы используете JavaScriptSerializer класс напрямую, следует использовать RegisterConverters метод для регистрации преобразователя. В противном случае, если вы вызываете веб-методы из ECMAScript (JavaScript) и хотите использовать пользовательский преобразователь, его можно зарегистрировать, добавив converters элемент в файл конфигурации. Дополнительные сведения см. в разделе "Практическое руководство. Настройка служб ASP.NET в Microsoft Ajax".

JavaScriptSerializer При сериализации типа, для которого зарегистрирован пользовательский преобразователь, сериализатор вызывает Serialize метод. Аналогичным образом, когда JavaScriptSerializer экземпляр десериализует строку нотации объектов JavaScript (JSON) и распознает, что тип внутри строки JSON имеет пользовательский преобразователь, связанный с ним, сериализатор вызывает Deserialize метод.

Примечания для тех, кто реализует этот метод

При наследовании от JavaScriptConverterних необходимо переопределить следующие элементы:

Конструкторы

JavaScriptConverter()

Инициализирует новый экземпляр класса JavaScriptConverter.

Свойства

SupportedTypes

При переопределении в производном классе возвращает набор поддерживаемых типов.

Методы

Deserialize(IDictionary<String,Object>, Type, JavaScriptSerializer)

При переопределении в производном классе преобразовывает предоставленный словарь в объект указанного типа.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
Serialize(Object, JavaScriptSerializer)

При переопределении в производном классе составляет словарь из пар имя/значение.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Применяется к

См. также раздел