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них необходимо переопределить следующие элементы:
Deserialize(IDictionary<String,Object>, Type, JavaScriptSerializer)
SupportedTypes JavaScriptSerializer ConvertToType<T>(Object) предоставляет метод, который будет использоваться средствами JavaScriptConverterреализации . Код преобразователя должен принимать значение, содержащееся в словаре, которое сериализатор передает в него, а затем преобразовать это значение в объект типа
T. Вместо повторной реализации пользовательского кода преобразования для этого можно вызвать ConvertToType<T>(Object) метод.
Конструкторы
| Имя | Описание |
|---|---|
| JavaScriptConverter() |
Инициализирует новый экземпляр класса JavaScriptConverter. |
Свойства
| Имя | Описание |
|---|---|
| SupportedTypes |
При переопределении в производном классе получает коллекцию поддерживаемых типов. |
Методы
| Имя | Описание |
|---|---|
| Deserialize(IDictionary<String,Object>, Type, JavaScriptSerializer) |
При переопределении в производном классе преобразует предоставленный словарь в объект указанного типа. |
| Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
| GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
| GetType() |
Возвращает Type текущего экземпляра. (Унаследовано от Object) |
| MemberwiseClone() |
Создает неглубокую копию текущей Object. (Унаследовано от Object) |
| Serialize(Object, JavaScriptSerializer) |
При переопределении в производном классе создает словарь пар name/value. |
| ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |