Поделиться через


DataContractResolver Класс

Определение

Предоставляет механизм динамического сопоставления типов с представлением xsi:type во время сериализации и десериализации.

public ref class DataContractResolver abstract
public abstract class DataContractResolver
type DataContractResolver = class
Public MustInherit Class DataContractResolver
Наследование
DataContractResolver
Производный

Примеры

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

class MyDataContractResolver : DataContractResolver
{
    private Dictionary<string, XmlDictionaryString> dictionary = new Dictionary<string, XmlDictionaryString>();
    Assembly assembly;

    // Definition of the DataContractResolver
    public MyDataContractResolver(Assembly assembly)
    {
        this.assembly = assembly;
    }

    // Used at deserialization
    // Allows users to map xsi:type name to any Type
    public override Type ResolveName(string typeName, string typeNamespace, Type declaredType, DataContractResolver knownTypeResolver)
    {
        XmlDictionaryString tName;
        XmlDictionaryString tNamespace;
        if (dictionary.TryGetValue(typeName, out tName) && dictionary.TryGetValue(typeNamespace, out tNamespace))
        {
            return this.assembly.GetType(tNamespace.Value + "." + tName.Value);
        }
        else
        {
            return null;
        }
    }
    // Used at serialization
    // Maps any Type to a new xsi:type representation
    public override bool TryResolveType(Type type, Type declaredType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace)
    {
        string name = type.Name;
        string namesp = type.Namespace;
        typeName = new XmlDictionaryString(XmlDictionary.Empty, name, 0);
        typeNamespace = new XmlDictionaryString(XmlDictionary.Empty, namesp, 0);
        if (!dictionary.ContainsKey(type.Name))
        {
            dictionary.Add(name, typeName);
        }
        if (!dictionary.ContainsKey(type.Namespace))
        {
            dictionary.Add(namesp, typeNamespace);
        }
        return true;
    }
}

Комментарии

Разработчики должны быть осторожны с тем, какие данные отправляются по сети. Для защиты данных можно использовать безопасность транспорта или сообщений. Дополнительные сведения см. в статье Безопасность.

Предупреждение

Используйте только DataContractResolver в том случае, если вы полностью уверены, какие сведения сериализуются. Вредоносные типы могут привести к непредвиденному поведению.

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

DataContractResolver()

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

Методы

Equals(Object)

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

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

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

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

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

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

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

(Унаследовано от Object)
ResolveName(String, String, Type, DataContractResolver)

Переопределение этого метода, чтобы во время десериализации сопоставить указанное имя xsi:type и пространство имен с типом контракта данных.

ToString()

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

(Унаследовано от Object)
TryResolveType(Type, Type, DataContractResolver, XmlDictionaryString, XmlDictionaryString)

Переопределение этого метода, чтобы во время сериализации сопоставить тип контракта данных с именем xsi:type и пространством имен.

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